[BZOJ 3261]最大异或和:可持久化字典树
来源:互联网 发布:品质365 知乎 编辑:程序博客网 时间:2024/06/10 17:18
点击这里查看原题
插入操作只会插入到末尾,因此可以用可持久化字典树,rt[i]表示维护的是前i-1个数的异或值,同时维护所有数的异或值tot,因此要得到a[i]~a[n]的异或值就是用rt[i]的查询值异或tot。
那么对于询问而言,我们在字典树上贪心即可
/*User:SmallLanguage:C++Problem No.:3261*/#include<bits/stdc++.h>#define ll long long#define inf 999999999using namespace std;const int M=6e5+5;int n,m,sum,ch[M*28][2],cnt[M*28],tot,rt[M];void ins(int &x,int v,int c){ int px=x; x=++tot; cnt[x]=cnt[px]+1; if(c<0) return; ch[x][0]=ch[px][0]; ch[x][1]=ch[px][1]; int son=((v>>c)&1); ins(ch[x][son],v,c-1);}int query(int s,int t,int v){ int l=rt[s-1],r=rt[t]; int res=0; for(int i=26;i>=0;i--){ int son=((v>>i)&1); son^=1; if(cnt[ch[r][son]]-cnt[ch[l][son]]<=0) son^=1; if(son) res|=(1<<i); l=ch[l][son]; r=ch[r][son]; } return res;}int main(){ freopen("data.in","r",stdin);// scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int a; scanf("%d",&a); rt[i]=rt[i-1]; ins(rt[i],sum,26); sum^=a; } while(m--){ char op[3]; scanf("%s",op); if(op[0]=='Q'){ int l,r,a; scanf("%d%d%d",&l,&r,&a); int tar=sum^a; printf("%d\n",tar^query(l,r,tar)); } else{ int a; scanf("%d",&a); rt[++n]=rt[n-1]; ins(rt[n],sum,26); sum^=a; } } return 0;}
阅读全文
0 0
- [可持久化字典树] BZOJ 3261 最大异或和
- bzoj 3261最大异或和 可持久化字典树
- bzoj 3261: 最大异或和 可持久化字典树
- [BZOJ 3261]最大异或和:可持久化字典树
- BZOJ 3261: 最大异或和 可持久化字典树
- bzoj3261 最大异或和(可持久化字典树)
- BZOJ3261最大异或和(可持久化字典树)
- BZOJ 3261 最大异或和 可持久化Trie
- BZOJ 3261 最大异或和 可持久化Trie
- [BZOJ]3261: 最大异或和 可持久化Trie
- bzoj 3261 最大异或和 可持久化trie树
- BZOJ 3261 最大异或和 可持久化Trie树
- BZOJ 3261: 最大异或和|可持久化Tire树
- BZOJ 3261 浅谈可持久化TRIE树最大连续异或和
- BZOJ 3261 最大异或和 && qwb VS 去污棒(可持久化01Trie)
- BZOJ 3261 可持久化字典树
- 3261: 最大异或和 可持久化trie
- 【BZOJ3261】最大异或和【可持久化Trie树】
- LeetCode 452. Minimum Number of Arrows to Burst Balloons
- [centos] apache、php配置
- 常见的C++面试题之String类
- sql注释语句
- 51nod 1350
- [BZOJ 3261]最大异或和:可持久化字典树
- 7.将0移至末尾
- 数组
- hdu 1114 Piggy-Bank(完全背包)
- 如何用数组做乘法表
- HTML ,CSS,JS 等注释的区别
- 字符拥有权重后的哈夫曼编码
- React Native 二维码扫描组件(简单,易用!)
- mybatis generator eclipse 使用