暑假集训单切赛第一场 POJ 2309 BST(找规律的题)

题意:给出一棵二分搜索树,再给一个节点编号n,求以这个节点为根节点的子树叶子节点的最大值与最小值。

首先求n所在的层数,他的层数就是他的因子中2的个数(规律). n的左右各有num=2^i-1个数。最小值是n-num,最大值是n+num

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue> using namespace std;
int t,n; int finds(int n){
for(int i=;i<=;i++){
if((<<i)<=n && n<(<<(i+)))
return i;
}
}
int main()
{
scanf("%d",&t);
for(int i=;i<=t;i++){
scanf("%d",&n);
int k=;
int tmp=n;
while(){
if(tmp%==){
k++;
tmp=tmp/;
}
else{
break;
}
}
int mins=n-((<<k)-);
int maxs=n+((<<k)-);
printf("%d %d\n",mins,maxs);
}
return ;
}
上一篇:暑假集训单切赛第一场 CF 191A Dynasty Puzzles


下一篇:Get all static wms goodlocation data