您的位置:首页 > 其它

POJ 2309 BST

2016-02-16 13:10 267 查看
题目链接:http://poj.org/problem?id=2309

题意:好的,让我们来用一下原图,就是这样一个二叉树,给你一个节点,让你求这个节点和其子节点中,编号最大的和最小的,比如求12的就是 9和15。



思路:

让我们先把这些编号用二进制来表示。






找一下规律,发现每个数在第几层是由它后面有几个0决定的

而且一个节点在范围内属于中间的那个数,左右两边节点数量相等,而且分别都小于或大于根结点。

我们可以用树状数组的lowbit来求一下假设lowbit(x) = k;

可以发现左右子树的节点个数都是k-1,那么x-(k-1)就是最小的,x+(k-1)就是最大的。

#include <iostream>

using namespace std;

int n;

int lowbit(int x)
{
return x&(-x);
}
int main()
{
int t;
cin>>n;
while(n--)
{
cin>>t;
cout<<t-lowbit(t)+1<<" "<<t+lowbit(t)-1<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: