题解 | 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++;
			}
		}
	}
}
全部评论

相关推荐

烤点老白薯:亲娘嘞🐶💩啊你的简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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