从未每日的每日一题
E>F
但是没时间了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int t,n,a[100005],p[100005];
int tr[3200005][2],id[3200005],cnt;
ll k;
void init(){
for(int i=1;i<=cnt;i++)tr[i][0]=tr[i][1]=0,id[i]=0;
cnt=1;
}
int calc(int x,int y){
int u=1,res=0;
for(int i=30;i>=0;i--){
int p=(x>>i)&1,q=(y>>i)&1;
if(q==0)u=tr[u][p];
else{
res=max(res,id[tr[u][p]]);
u=tr[u][p^1];
}
if(!u)break;
}
res=max(res,id[u]);
return res;
}
void insert(int loc,int x){
int u=1;
id[u]=max(id[u],loc);
for(int i=30;i>=0;i--){
int p=(x>>i)&1;
if(!tr[u][p])tr[u][p]=++cnt;
u=tr[u][p];
id[u]=max(id[u],loc);
}
}
bool check(int x){
ll sum=0;
init();
for(int i=1;i<=n;i++){
p[i]=calc(a[i],x);
p[i]=max(p[i],p[i-1]);
sum+=p[i];
insert(i,a[i]);
}
return sum>=k;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%lld",&n,&k);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int l=0,r=(1<<30),res=0;
while(l<=r){
int mid=(l+r>>1);
if(check(mid))r=mid-1,res=mid;
else l=mid+1;
}
printf("%d\n",res);
}
return 0;
}
标签:int,res,每日,CF1983F,tr,mid,max,一题,id
From: https://www.cnblogs.com/kentsbk/p/18303330