BZOJ 3261: 最大异或和|可持久化Tire树
2016-02-19 21:11
363 查看
设a[i]为前i个数的异或和,Ans=x(xor)a[n](xor)a[p−1]使其最大化,然后可以用可持久化Tire树来维护一下.
数组开的一定要够大,1000W还是会跪!!!!
数组开的一定要够大,1000W还是会跪!!!!
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<set> #include<map> #include<iostream> #include<algorithm> #define mx 1e9 #define lowbit(x) (x&(-x)) #define N 505 using namespace std; int sc() { int i=0,f=1; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i*f; } int ch[14000050][2],sum[14000050]; int v[600066],root[600066]; int n,cnt,Sum,m; void add(int pre,int &x,int w,int k) { if(!x)x=++cnt; sum[x]=sum[pre]+1; if(!k)return; bool e=(w&k); ch[x][!e]=ch[pre][!e]; add(ch[pre][e],ch[x][e],w,k>>1); } int ask(int l,int r,int x) { int k=1<<24,ans=0; while(k) { bool e=!(x&k); if(sum[ch[r][e]]-sum[ch[l][e]]) ans+=k,r=ch[r][e],l=ch[l][e]; else r=ch[r][!e],l=ch[l][!e]; k>>=1; } return ans; } int main() { n=sc()+1;m=sc();v[1]=0; for(int i=2;i<=n;i++)v[i]=v[i-1]^sc(); for(int i=1;i<=n;i++) add(root[i-1],root[i],v[i],1<<24); for(int i=1;i<=m;i++) { char s[10]; scanf("%s",s); if(s[0]=='A') ++n,v =v[n-1]^sc(), add(root[n-1],root ,v ,1<<24); else { int l=sc()-1,r=sc(),x=sc()^v ; printf("%d\n",ask(root[l],root[r],x)); } } return 0; }
相关文章推荐
- 用内存占用曲线画正弦波
- 《万历十五年》读书笔记
- sql语句批量替换字段数据
- Spark MLlib 1.6 -- 数据类型篇
- 解决word转pdf后图片失真
- 深入理解Linux网络技术内幕——中断与网络驱动程序
- codeforces 618d 搜索
- css之几个细节
- c语言入门之项目2.0——成绩等级
- HashSet如何判定两个元素相同
- 总结学习Fckeditor使用方法
- 指针那些概念
- Asp.net MVC 的八个扩展点
- HDU 5372 Segment Game - 离散化&树状数组
- markdown学习3:使用Sublime Text作为Markdown编辑器
- Chapter 2、Eclipse(19th,Feb1)
- iOS屏幕适配
- linux学习第二天
- web学习博客2016/2/19
- 判断浏览器的方法