题目链接

这个每次修改后缀好像很难搞,但是因为异或可以抵消,求sum[p~n]的最大值可以转化为求sum[1~n] xor sum[1~p-1]的最大值。
\(p-1\in [l-1,r-1]\),用可持久化Trie查区间[l-1,r-1] xor x xor sum[1~n]的最大值即可。
另外可持久化Trie查的是区间某一个数异或另一个数的最大值,所以要插入的是前缀和。

注意对于区间[1,1]的询问是可以用0 xor的,所以要在前面加上这个0,而且不能在root[0]加(除非用root[l-2=-1])。不妨直接向右偏移1,在root[1]插入这个0。

//179000kb  3508ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 50000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define BIT 23
const int N=6e5+5;//N+M!int root[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Trie
{#define S N*25int tot,son[S][2],sz[S];void Insert(int x,int y,int v){for(int i=BIT; ~i; --i){int c=v>>i&1;son[x][c]=++tot, son[x][c^1]=son[y][c^1];x=tot/*son[x][c]*/, y=son[y][c];sz[x]=sz[y]+1;}}int Query(int x,int y,int v)//x~y{int res=0;for(int i=BIT; ~i; --i){int c=(v>>i&1)^1;if(sz[son[y][c]]-sz[son[x][c]]>0)x=son[x][c], y=son[y][c], res|=1<<i;elsec^=1, x=son[x][c], y=son[y][c];}return res;}
}T;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline char readc()
{register char c=gc();for(; c!='A'&&c!='Q'; c=gc());return c;
}int main()
{int n=read()+1, Q=read(), sum=0;T.Insert(root[1]=++T.tot,0/*root[0]*/,0);for(int i=2; i<=n; ++i)T.Insert(root[i]=++T.tot,root[i-1],sum^=read());for(int l,r; Q--; )if(readc()=='A')T.Insert(root[n+1]=++T.tot,root[n],sum^=read()), ++n;elsel=read(),r=read(),printf("%d\n",T.Query(root[l-1],root[r],sum^read()));//偏移了就正常了..
//          l=read(),r=read(),printf("%d\n",T.Query(root[std::max(l-2,0)],root[r-1],sum^read()));return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/9717663.html

BZOJ.3261.最大异或和(可持久化Trie)相关推荐

  1. BZOJ 3261: 最大异或和 [可持久化Trie]

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1513  Solved: 657 [Submit][Status][Disc ...

  2. BZOJ 3261 最大异或和 可持久化Trie树

    题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...

  3. BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 3519  Solved: 1493 [Submit][Status][Dis ...

  4. bzoj 3261 最大异或和【可持久化trie】

    因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]. 首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和 然后 ...

  5. 【bzoj3261】最大异或和 可持久化Trie树

    题目描述 给定一个非负整数序列 {a},初始长度为 N.        有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2.Q l r x: ...

  6. BZOJ3261: 最大异或和(可持久化trie树)

    题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...

  7. P4592 [TJOI2018]异或 (可持久化Trie)

    [题目链接] https://www.luogu.org/problemnew/show/P4592 题目描述 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\ ...

  8. P4735 最大异或和 可持久化trie树

    可持久化01trie类似主席树思想    但是不支持版本差(也可以加一个siz 做差)    只能再维护一个左端点的最大值即可 #include<bits/stdc++.h> using ...

  9. 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 474  Solved: 258 D ...

最新文章

  1. 美元加息怎么“剪羊毛”
  2. golang模板与json的应用
  3. PAT甲级1046 Shortest Distance:[C++题解]前缀和
  4. 数据库视频总结二(Transact-SQL语言)
  5. [vijos1162]波浪数
  6. oracle 静默 建库,静默安装Oracle 11gR2软件并且手动建库
  7. 数据结构 堆 栈 是什么 区别
  8. 元素偏移量offset系列(附实例)
  9. JAVA将图片转成base64导出到word中
  10. “今夜酒店特价”的商业模式是什么?www.souapp.com搜应用推荐
  11. win11系统中文名改英文名(win11、win10修改用户名)超详细图文
  12. clientX,clientY,screenX,screenY,offsetX,offsetY 区别测试
  13. 【深度学习】神经网络的学习过程
  14. Kibana数据表格
  15. 网络工程师备考6章(续3)
  16. 如何查看raid控制器的信息HP DELL
  17. 计算机四级网络工程师考点总结
  18. 2021年Gartner数据防泄露市场指南发布,做为中国数据安全代表性厂商天空卫士连续三年入选
  19. android 涂鸦(清屏,画笔,粗细,保存)以及canvas源码学习
  20. python画猪头程序_用python画猪头的方法

热门文章

  1. iview select 内存泄漏_Vue遇到的内存泄漏排查处理
  2. 运维学python哪部分_初入运维的小伙伴,别再问需不需要学Python了
  3. 北风网ajax,[T8:JavaScript中利用Ajax实现客户端与服务器端通信北风网收费视频讲座.ppt...
  4. WPF RadioButton按钮控件取消选中设置
  5. 使用Python编写Prometheus监控metrics接口
  6. OPNET网络仿真分析-1.2、OPNET安装教程
  7. matlab2c使用c++实现matlab函数系列教程-circshift函数
  8. Backend Qt5Agg is interactive backend. Turning interactive mode on.
  9. leetcode_day02
  10. 洛谷 P3958 奶酪