首页 > 代码库 > poj 2309 BST 使用树状数组的lowbit

poj 2309 BST 使用树状数组的lowbit

如果领悟了树状数组中的lowbit,这道题就是极其简单的,最底层都是奇数,用lowbit(x)寻找x的父亲,然后x的父亲-1就是最大数

至于lowbit是如何计算的嘛,寻找x的父亲,其实就是x+2^x的二进制末尾0的个数。

#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
 ll lowbit(int x){
    return x&(-x);
}
int main(){
    ll n,a;
    cin>>n;
    while(n--){
        cin>>a;
        if(a%2!=0){
            cout<<a<<" "<<a<<endl;
        }
        else{
            ll max=a+lowbit(a)-1;
            ll min=a-(max-a);
            cout<<min<<" "<<max<<endl;
        }
    }
}