由完全二叉树的性质可知,树的总深度g(n),除了最后一层,第i层的节点个数为2的i-1次方,当层数为i时,深度j为i-1,即深度 j的节点个数为2的j次方。
要判断与x号节点深度相同的节点数量,只需要判断x的深度high。
若x不在最后一层,则与x号节点深度相同的节点数量为2的high 次方;
若x在最后一层,则与x号节点深度相同的节点数量为n减去第一层至倒数第二层的所有节点数,即n减去最后一层的第一个数字后加1。 下面是代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int T;
cin>>T;
while(T--){
int n,q;
cin>>n>>q;
while(q--){
int x,high=0,sum=__lg(n),ans;
cin>>x;
while(x!=1){
x/=2;
high++;
}
if(high<sum){
ans=1LL<<high;
}
else ans=n-(1LL<<high)+1;
cout<<ans<<endl;
}
}
}

京公网安备 11010502036488号