题解:CF1935E Distance Learning Courses in MAC
一拍桌子,两眼放光,直接 ST 表维护
然后你就假了。
某个反面教材,我不说是谁。
思路
定义舍弃为把一个数
假设每个位置选了
我们不知道舍弃哪个位置,所以很难不预处理哪些位置可以被舍弃。显然地,
设
每次询问时,肯定要从高位开始贪心。只有
代码
#include<cstdio>
int T,n,x[200001],y[200001],f[30][200001],g[30][200001],q,l,r,ans;
int read(){
int x=0;
char c=getchar();
while(c<48||c>57)c=getchar();
while(c>47&&c<58)x=x*10+c-48,c=getchar();
return x;
}
int main(){
T=read();
while(T--){
n=read();
for(int i=1;i<=n;++i)x[i]=read(),y[i]=read();
for(int i=0;i<30;++i){
for(int j=1;j<=n;++j){
f[i][j]=f[i][j-1]+(y[j]>>i&1),g[i][j]=g[i][j-1];
if(y[j]>>i&1&&(y[j]^1<<i|((1<<i)-1))>=x[j])++g[i][j];
}
}
q=read();
while(q--){
l=read(),r=read(),ans=0;
for(int i=29;~i;--i){
if(f[i][r]-f[i][l-1])ans|=1<<i;
if(f[i][r]-f[i][l-1]>1&&g[i][r]-g[i][l-1]){ans|=(1<<i)-1;break;}
}
printf("%d ",ans);
}
printf("\n");
}
return 0;
}