由于题目比较简单,今天双开,打了3月普及组模拟赛和这个,然后状态也不好,一个第三名一个第15名,发挥失常
题目链接
这个链接好像只能报了名的进去?
前面的题都很简单,但也要注意代码别写错,直接怼最后一个题:
J-程序设计:小明的赈灾计划
考虑前缀异或后 就成功的将题转化为给你n个数,要求两两异或的最大值,字典树的经典操作了,对二进制进行拆分建树,然后求最大值时在树上 跑与当前位 相反的一位就可以了(从高到低位跑)
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,pre[N],a[N],ans; int tr[N*32][2],tot; void in(int x) { int u=0; for(int i=30;i>=0;--i){ if(!tr[u][(x>>i)&1]) tr[u][(x>>i)&1]=++tot; u=tr[u][(x>>i)&1]; } } int qu(int x) { int ans=0,u=0; for(int i=30;i>=0;--i){ if(tr[u][(x>>i)&1^1]){ ans+=1<<i; u=tr[u][((x>>i)&1)^1]; } else u=tr[u][(x>>i)&1]; } return ans; } int main() { cin>>n; for(int i=1;i<=n;++i){ scanf("%d",&a[i]); pre[i]=pre[i-1]^a[i]; ans=max(ans,pre[i]); } in(a[1]); for(int i=2;i<=n;++i){ ans=max(ans,qu(pre[i])); in(pre[i]); } printf("%d\n",ans); }