"华为杯" 武汉大学21级新生程序设计竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
D.和谐之树(线段树)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=70;
ll ma=-1;
int pw(ll x){
int c=0;
while(x){//判断是不是2的n次方
if(x==1)break;
if(x%2!=0){
c=1;
break;
}
x/=2;
}
if(c==1)return 0;
else return 1;
}
void build(ll p,ll l,ll r){//时间复杂度o(logn)
if(l==r){//到子节点处,更新最大值
if(p>ma)ma=p;
return ;
}
ll mid=(l+r)/2;
if(l+1==r)build(p*2+1,mid+1,r);//如果是子节点的上一个节点,则往右走
else if(pw(r-l))build(p*2,l,mid);//往右或往左去寻找子节点,l和r相差如果是2的次方就往左走,否则往右
else build(p*2+1,mid+1,r);
}
int main(){
ll n;
cin>>n;
while(n--){
ll m;
cin>>m;
build(1,1,m);
cout<<ma<<endl;
ma=-1;
}
return 0;
}