J
要找到x号深度相同的数量,其实就是找出x所在层的总数,第i层的数量为2的i-1次方((i-1)<<1),通过动态求出前i层的总节点数,最后一层的总节点数为n,要通过编码号求出所在的层数,只需要将该编号不断除以2直至等于0,统计出除了几次,这个次数便是所在的层数,当求出所在层数d后只需要将dp[d]-dp[d-1]就能求出d层的节点总数,而这就是答案
#include
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
long long n,q;
cin>>n>>q;
long long h=0;
long long temp=n;
while(temp>0){
h++;
temp/=2;
}
vector dp(h+1,0);
dp[1]=1;
for(long long i=2;i<=h;i++){
dp[i]=dp[i-1]+((long long)1<<(i-1));
}
dp[h]=n;
while(q--){
long long x;
cin>>x;
long long d=0;
long long current_x=x;
while(current_x>0){
d++;
current_x/=2;
}
cout<
#include
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
long long n,q;
cin>>n>>q;
long long h=0;
long long temp=n;
while(temp>0){
h++;
temp/=2;
}
vector dp(h+1,0);
dp[1]=1;
for(long long i=2;i<=h;i++){
dp[i]=dp[i-1]+((long long)1<<(i-1));
}
dp[h]=n;
while(q--){
long long x;
cin>>x;
long long d=0;
long long current_x=x;
while(current_x>0){
d++;
current_x/=2;
}
cout<
全部评论
相关推荐
查看10道真题和解析