其实就是检查树状数组lowbit的运用,我发现一个节点左下方的数等于它减去“他的lowbit右
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int n,m; int main() { while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { scanf("%d",&m); int maxi=m,mini=m;//如果是叶子,就等于他本身 int bit=m&-m;//lowbit bit=bit>>1;//右移一位 while(bit>0)//最后一位右移等于0 { maxi+=bit;//右下方的等于加 bit=maxi&-maxi; bit=bit>>1; } bit=m&-m;//同上 bit=bit>>1; while(bit>0) { mini-=bit; bit=mini&-mini;//左下方的减 bit=bit>>1; } printf("%d %d\n",mini,maxi); } } return 0; }
移一位”,他右下方的数等于它加上“他的lowbit右移一位”,直到到二进制的最后一位为止。