bzoj3261 最大异或和【可持久化trie树】
来源:互联网 发布:五月天车祸现场知乎 编辑:程序博客网 时间:2024/05/22 16:56
解题思路:
题目要求的是a[p]^a[p+1]^……^a[n]^x的最大值。
而该式等于sum[p-1]^sum[n]^x,其中sum[i]表示a[1]^a[2]^……^a[i]。
sum[n]^x可以直接算出,所以我们相当于每次去区间[l-1,r-1]中贪心找异或(sum[n]^x)的最优值
可以像建主席树一样建一棵可持久化trie树,第i棵树储存1~i所有的sum值。每新加一个数字,就新开一条链,并把上面的cnt值加一。
查找区间[l-1,r-1]中是否有一个数,就看第r-1棵树减第l-2棵树对应节点的cnt是否为0。
这样就可以像普通的trie树一样从高位开始贪心了。
注意如果我们询问[1,r],就要用第r-1棵树减去第-1棵树,下标越界,所以要把所有位置后移一位,并在第1个位置建一棵表示0的trie数代表sum[0]=0。
#include<bits/stdc++.h>#define ll long longusing namespace std;int getint(){ int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-')f=-1; for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f;}const int N=600005;struct node{ int son[2],cnt;}tr[N*30];int n,m,tot,ans,rt[N];char s[2];void Insert(int &x,int y,int d,int num){ tr[x=++tot]=tr[y],tr[x].cnt++; if(d<0)return; int t=num&(1<<d)?1:0; Insert(tr[x].son[t],tr[y].son[t],d-1,num);}void query(int x,int y,int d,int num){ if(d<0)return; int t=num&(1<<d)?1:0,dl=tr[tr[x].son[t^1]].cnt,dr=tr[tr[y].son[t^1]].cnt; if(dr-dl)ans|=(1<<d),query(tr[x].son[t^1],tr[y].son[t^1],d-1,num); else query(tr[x].son[t],tr[y].son[t],d-1,num);}int main(){ //freopen("lx.in","r",stdin); n=getint()+1,m=getint(); int sum=0,l,r,x; Insert(rt[1],rt[0],24,0); for(int i=2;i<=n;i++) { x=getint();sum^=x; Insert(rt[i],rt[i-1],24,sum); } while(m--) { scanf("%s",s); if(s[0]=='A') { x=getint();sum^=x; Insert(rt[++n],rt[n],24,sum); } else { l=getint()+1,r=getint()+1,x=getint(); x^=sum;ans=0; query(rt[l-2],rt[r-1],24,x); cout<<ans<<'\n'; } } return 0;}
阅读全文
0 0
- 【BZOJ3261】最大异或和【可持久化Trie树】
- bzoj3261 最大异或和【可持久化trie树】
- [BZOJ3261][最大异或和][可持久化Trie]
- [可持久化Trie] BZOJ3261: 最大异或和
- bzoj3261 最大异或和(可持久化Trie)
- [BZOJ3261]最大异或和(可持久化trie树)
- 【bzoj3261】【最大异或和】可持久化trie树+贪心
- bzoj3261最大异或和&&可持久化Trie树详解
- bzoj3261 最大异或和(可持久化字典树)
- BZOJ3261最大异或和(可持久化字典树)
- [BZOJ3261]-可持久化trie
- BZOJ3261: 最大异或和(可持续化Trie)
- BZOJ 3261 最大异或和 可持久化Trie
- BZOJ 3261 最大异或和 可持久化Trie
- 3261: 最大异或和 可持久化trie
- [BZOJ]3261: 最大异或和 可持久化Trie
- bzoj 3261 最大异或和 可持久化trie树
- BZOJ 3261 最大异或和 可持久化Trie树
- Python入门2
- 万达狂跌债股双杀,王思聪婚礼却发百万红包
- 数据库MySQL(1)——增删改查
- 浅谈哈希码
- 网络协议分析(MPLS/VPN协议分析)
- bzoj3261 最大异或和【可持久化trie树】
- JAVA 四 流程控制
- Android权限动态申请
- 机器学习实战-AdaBoost-python代码
- 如何用jquery获取input输入框中的值?
- mui底部导航-基于webview模式
- 杭电acm 1052 田忌赛马
- Ruby on rails初体验(三)
- CSDN-markdown编辑器-帮助