题解 | J题解
Branch of Faith
https://ac.nowcoder.com/acm/contest/120563/J
二叉树每层的节点个数为:1,2,4,8,16,32...
二叉树每层最后一个节点编号:1,3,7,15,31,63...
输入节点数后,开一个map数组,分别记录每层的节点总数及最后一个节点编号,然后遍历map数组,直到找到查询的节点编号小于等于某一层最后一个节点时,输出这层的节点总数。
```#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
signed main() {
int T;
cin>>T;
while(T--)
{
int n,q;
cin>>n>>q;
int f=1,i=1;
map<int,pii> mp;
for(;n>0;f<<=1)
{
mp[i++]={min(n,f),f*2-1};
n-=f;
}
while(q--)
{
int p;
cin>>p;
int f=0,i=1;
while(f==0)
{
if(p<=mp[i].second)
{
cout<<mp[i].first<<"\n";
f=1;
}
i++;
}
}
}
}