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<
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务