题目链接:http://poj.org/problem?id=2309
题目描述:
给定一个二叉树,有特点的二叉树,给定一个根的标号,能够一直向左能找到以它为根的子树的最小标号,一直向右能找到以它为根的子树的最大标号,然后把他们输出就行。
可能有其他方法解,但有一种我认为比较好的解法,即每一棵子树,若根为奇数,直接输出即可,根为偶数,那么它的叶子节点的个数则是它的最小位(low bit)值,这样向左向右推过去就行。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std ;
#define ll long long
//low bit
int main(){
ll n, re1, re2 ;
while( cin >> n ){
ll a ;
for( int i = 0; i < n; i++ ){
cin >> a ;
if( a % 2 != 0 ){
cout << a << " " << a << endl ;
}
else{
ll low_bit = a&(-a) ;
cout << a+1-low_bit << " " << a+low_bit-1 << endl ;
}
}
}
return 0 ;
}