bzoj 3261 最大异或和【可持久化trie】
因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]。
首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和
然后就是可持久化trie的板子了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
int n,m,a[N],b[N],rt[N],cnt;
char c[];
struct qwe
{
int c[],sum;
}t[N*];
int read()
{
int r=;
char p=getchar();
while(p>''||p<'')
p=getchar();
while(p>=''&&p<='')
{
r=r*+p-;
p=getchar();
}
return r;
}
int add(int x,int v)
{
int tmp=++cnt,y=cnt;
for(int i=;i>=;i--)
{
t[y].c[]=t[x].c[];
t[y].c[]=t[x].c[];
t[y].sum=t[x].sum+;
int q=(v&(<<i))>>i;
x=t[x].c[q];
t[y].c[q]=++cnt;
y=t[y].c[q];
}
t[y].sum=t[x].sum+;
return tmp;
}
int ques(int l,int r,int v)
{
int re=;
for(int i=;i>=;i--)
{
int q=(v&(<<i))>>i;
if(t[t[r].c[q^]].sum-t[t[l].c[q^]].sum)
re+=(<<i),l=t[l].c[q^],r=t[r].c[q^];
else
l=t[l].c[q],r=t[r].c[q];
}
return re;
}
int main()
{
n=read(),m=read();
n++;
for(int i=;i<=n;i++)
a[i]=read();
for(int i=;i<=n;i++)
b[i]=b[i-]^a[i];
for(int i=;i<=n;i++)
rt[i]=add(rt[i-],b[i]);
while(m--)
{
scanf("%s",c);
if(c[]=='A')
{
a[++n]=read();
b[n]=b[n-]^a[n];
rt[n]=add(rt[n-],b[n]);
}
else
{
int l=read(),r=read(),x=read();
printf("%d\n",ques(rt[l-],rt[r],b[n]^x));
}
}
return ;
}
/*
5 5
2 6 4 3 6
A 1
Q 3 5 4
A 4
Q 5 7 0
Q 3 6 6
*/
bzoj 3261 最大异或和【可持久化trie】的更多相关文章
- BZOJ 3261: 最大异或和( 可持久化trie )
搞成前缀和然后就可以很方便地用可持久化trie维护了.时间复杂度O((N+M)*25) -------------------------------------------------------- ...
- BZOJ 3261 最大异或和 可持久化Trie树
题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...
- bzoj 3261 最大异或和 可持久化字典树(01树)
题目传送门 思路: 由异或的性质可得,题目要求的式子可以转化成求$max(pre[n]^x^pre[i])$,$pre[i]$表示前缀异或和,那么我们现在就要求出这个东西,所以用可持久化字典树来求,每 ...
- BZOJ 3261 最大异或和 (可持久化01Trie)
题目大意:让你维护一个序列,支持在序列末插入一个数,支持询问$[l,r]$区间内选择一个位置$p$,使$xor\sum_{i=p}^{n}a_{i}$最大 可持久化$01Trie$裸题,把 区间异或和 ...
- bzoj 3261: 最大异或和 (可持久化trie树)
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MB Description 给定一个非负整数序列 {a},初始长度为 N. ...
- BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3519 Solved: 1493[Submit][Status][Discu ...
- BZOJ 3261: 最大异或和
Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...
- BZOJ 3261 最大异或和(算竞进阶习题)
可持久化Trie 需要知道一个异或的特点,和前缀和差不多 a[p] xor a[p+1] xor....xor a[n] xor x = a[p-1] xor a[n] xor x 所以我们把a[1. ...
- BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...
随机推荐
- 一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5
译者地址:[翻]一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5 原文:First Look at New Android Gradle Build To ...
- three.js 源代码凝视(十五)Math/Plane.js
商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 - 本博客专注于 敏捷开发 ...
- oracle 导出数据字典
一.查看当前用户下表名,及表名的备注 select * from user_tab_comments where table_name like 'T_ONLINE%' 二.查询数据字典 -- 1. ...
- Sublime Text使用
安装Sublime Text Sublime 的安装比較简单,我们能够直接去官网http://www.sublimetext.com/,点击Download菜单.进入之后选择自己操作系统的进行下载安装 ...
- USB/IP项目总结
青云最近推出了云桌面功能,用户可以像使用本地计算机一样访问远程主机,支持USB重定向,不禁让我想起了2年前调试的一个开源项目USB/IP,当时还用英文写了一个总结性文档,放在这里方便以后查看. ...
- (testng多个class文件执行时混乱,不是等一个class内的所有methods执行完再去执行下一个class内的内容)问题的解决
问题描述如下: We use TestNG and Selenium WebDriver to test our web application. Now our problem is that we ...
- [ASP.NET MVC 小牛之路]05 - 使用 Ninject实现依赖注入
在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事情,续这篇文章之后,本文将用一个实际的示例来 ...
- git常用知识笔记
学习资料: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 http://codi ...
- C/C++ 操作符优先级
不能光转贴,有空要熟悉之后,要写点心得.现在发现 . 的优先级确实很高. C: Precedence Operator Description Associativity 1 ++ -- Suffix ...
- HDU 2746 Cyclic Nacklace
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...