【BZOJ】【3261】最大异或和
可持久化Trie
嗯……同样搞个前缀异或和,然后将x与sum异或一下,就是在[l-1,r-1]中找x^sum的最大异或值了。同样可持久化Trie搞搞即可(模板还是没背全啊……sad
/**************************************************************
Problem: 3261
User: Tunix
Language: C++
Result: Accepted
Time:3888 ms
Memory:239552 kb
****************************************************************/ //BZOJ 3261
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=;
/*******************template********************/ int n,m,t[N][],tot,rt[],id[N];
inline void Ins(int pre,int x,int k){
int now=rt[k]=++tot; id[tot]=k;
D(i,,){
int j=(x>>i)&;
t[now][j^]=t[pre][j^];
t[now][j]=++tot; id[tot]=k; now=tot;
pre=t[pre][j];
}
}
inline int ask(int l,int r,int x){
int ans=,now=rt[r];
D(i,,){
int j=((x>>i)&)^;
if (id[t[now][j]]>=l) ans|=<<i; else j^=;
now=t[now][j];
}
return ans;
} int main(){
#ifndef ONLINE_JUDGE
freopen("3261.in","r",stdin);
freopen("3261.out","w",stdout);
#endif
n=getint(); m=getint();
id[]=-;
Ins(rt[],,);
int sum=;
F(i,,n){
sum^=getint();
Ins(rt[i-],sum,i);
}
char cmd[]; int x,l,r;
F(i,,m){
scanf("%s",cmd);
if (cmd[]=='A'){
sum^=getint();
Ins(rt[n],sum,n+); n++;
}else{
l=getint(); r=getint(); x=getint();
printf("%d\n",ask(l-,r-,sum^x));
}
}
return ;
}
3261: 最大异或和
Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 743  Solved: 323
[Submit][Status][Discuss]
Description
给定一个非负整数序列 {a},初始长度为 N。       
有   M个操作,有以下两种操作类型:
 
1 、A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1。
2 、Q l r x:询问操作,你需要找到一个位置 p,满足 l<=p<=r,使得:
 
a[p] xor a[p+1] xor ... xor a[N] xor x 最大,输出最大是多少。
Input
第一行包含两个整数 N  ,M,含义如问题描述所示。   
第二行包含 N个非负整数,表示初始的序列 A 。 
 
接下来 M行,每行描述一个操作,格式如题面所述。
Output
假设询问操作有 T个,则输出应该有 T行,每行一个整数表示询问的答案。
Sample Input
2 6 4 3 6
A 1
Q 3 5 4
A 4
Q 5 7 0
Q 3 6 6
对于测试点 1-2,N,M<=5 。
对于测试点 3-7,N,M<=80000 。
对于测试点 8-10,N,M<=300000    。
其中测试点 1, 3, 5, 7, 9保证没有修改操作。
对于 100%        的数据,         0<=a[i]<=10^7。
Sample Output
5
6
HINT
对于 100% 的数据, 0<=a[i]<=10^7 。
Source
【BZOJ】【3261】最大异或和的更多相关文章
- BZOJ 3261: 最大异或和( 可持久化trie )
		
搞成前缀和然后就可以很方便地用可持久化trie维护了.时间复杂度O((N+M)*25) -------------------------------------------------------- ...
 - 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 3261 最大异或和     可持久化字典树(01树)
		
题目传送门 思路: 由异或的性质可得,题目要求的式子可以转化成求$max(pre[n]^x^pre[i])$,$pre[i]$表示前缀异或和,那么我们现在就要求出这个东西,所以用可持久化字典树来求,每 ...
 - bzoj 3261 最大异或和【可持久化trie】
		
因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]. 首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和 然后 ...
 - BZOJ 3261 最大异或和 (可持久化01Trie)
		
题目大意:让你维护一个序列,支持在序列末插入一个数,支持询问$[l,r]$区间内选择一个位置$p$,使$xor\sum_{i=p}^{n}a_{i}$最大 可持久化$01Trie$裸题,把 区间异或和 ...
 - 可持久化+Trie || BZOJ 3261最大异或和 || Luogu P4735 最大异或和
		
题面:最大异或和 代码: #include<cstdio> #include<cstring> #include<iostream> using namespace ...
 - bzoj 3261最大异或和
		
Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要 ...
 
随机推荐
- 关于SQL表联接
			
以SQL2008为例,Microsoft SQL Server 2008支持四种表运算符-JOIN,APPLY,PIVOT,UNPIVOT.JOIN表运算符是ANSI标准,而其他三种是T-SQL对标准 ...
 - group by和distinct语句的执行顺序
			
同一条语句之中,如果同时有group by和distinct语句,是先group by后distinct,还是先distinct后group by呢? 先说结论:先group by后distinct. ...
 - 【转】MySQL GRANT REVOKE用法
			
MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器 授权->确定用户是否拥有足够的权限执行查询请求等. 如果认证不成功的话,哪么授权肯定是无法进行的. revo ...
 - 批量删除的js代码
			
<script type="text/javascript"> function seltAll(){ var chckBoxSign = document.getEl ...
 - Oracle sql trace
			
一.SQL_TRACE说明 1.1.在全局启用 在参数文件(pfile/spfile)中指定:sql_trace =true 1.2.在当前session级设置 启用当前session的跟踪: alt ...
 - uboot启动流程
			
uboot 的启动过程及工作原理2.1 启动模式介绍 大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅 ...
 - linux设备驱动层次
			
USB 采用树形拓扑结构,主机侧和设备侧的USB 控制器分别称为主机控制器(HostController)和USB 设备控制器(UDC),每条总线上只有一个主机控制器,负责协调主机和设备间的通信,而设 ...
 - C# 将\u1234类型的字符转化成汉字
			
用代码获取网页的json数据时,经常会出现\u1234等字符,其实我们是知道他是汉字的 可以用下面的方法将\u1234翻译成汉字 /// <summary> /// /// </su ...
 - kettle删除资源库中的转换或者作业
			
在资源库中新建转换,作业都很简单,那么加入现在不需要其中某个转换或者作业该怎么办呢? 下图是已经存在的转换跟作业 现在需要删除aa这个转换 操作步骤如下: 1.工具----资源库----探索资源库 出 ...
 - oracle 11g 添加控制文件
			
OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...