题目链接:
BST
题目很好理解,不再赘述题意
思路:
看很多文章都说是树状数组,但是我仔细想了想,发现跟树状数组还是有区别的,只能说跟数状数组类似,但是不是树状数组
利用树状数组中的lowbit来计算
这个二叉树的节点值,从左向下每个节点减的都是当前节点值的lowbit() / 2,那么最后减的总数不就是,给定根节点的lowbit() - 1,同理,从右往下走,加的是根节点的lowbit() - 1,可以拿笔将其转化为二进制试一试,这个值就是根节点lowbit() / 2 的值在二进制的位置然后一直到0位的和,上面的公式其实就是等比数列从2^0加到2 ^ k(k就表示lowbit() / 2在二进制中的第几位,当然,是从0计数。。)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <sstream>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1000005;
int lowbit(int x)
{
return x&(-x);
}
int main()
{
int cas;
cin>>cas;
while(cas--){
int num;
cin>>num;
cout<<num - lowbit(num) + 1<<' '<<num + lowbit(num) - 1<<endl;
}
return 0;
}