bzoj3261
xor有一个很重要的性质就是A xor B xor B=A
所以这道题求[l,r]中p,使a[p] xor a[p+1] xor ... xor a[N] xor x 最大
就是=最大化a[1] xor ……a[n] xor x xor a[1] xor a[2] xor ……a[p-1]
令b[i]=a[1] xor a[2] xor ……a[i]
则最大化b[p] xor b[n] xor X p∈[l-1,r-1]
抛开区间,求b[p] xor Y的最大值我们需要用到trie树
由于是区间修改,所以要求我们对trie进行可持久化
类比主席树,我们对每个i都建立一棵trie树,不同的节点增开空间
在区间询问的时候,如果两棵树指向同一个节点,说明这一位上的值是不能取的,否则就按trie的贪心做
感觉可持久化就是对历史信息尽可能的保留,对新的值新开空间
var son:array[-..,..] of longint;
i,t,x,l,r,n,m:longint;
b,root:array[-..] of longint;
ch:char; procedure add(j,x:longint);
var i,a,b,y:longint;
begin
a:=root[j-];
b:=root[j];
for i:= downto do
begin
y:=x and ( shl i);
if y> then y:=;
inc(t);
son[b,y]:=t; //类比主席树
son[b,-y]:=son[a,-y];
a:=son[a,y];
b:=son[b,y];
end;
end; function ask(l,r,x:longint):longint;
var y,i,a,b:longint;
begin
a:=root[l];
b:=root[r];
ask:=;
for i:= downto do
begin
y:=x and ( shl i);
if y> then y:=;
if (son[b,-y]=) or (son[b,-y]=son[a,-y]) then //判断这位在区间内是否存在
begin
a:=son[a,y];
b:=son[b,y];
end
else begin
ask:=ask+ shl i;
a:=son[a,-y];
b:=son[b,-y];
end;
end;
end; begin
readln(n,m);
b[]:=;
t:=;
root[]:=;
x:=;
for i:= downto do
begin
inc(t);
son[x,]:=t;
x:=t;
end;
for i:= to n do
begin
read(x);
b[i]:=b[i-] xor x;
inc(t);
root[i]:=t;
add(i,b[i]);
end;
readln;
for i:= to m do
begin
read(ch);
if ch='A' then
begin
readln(x);
inc(n);
b[n]:=b[n-] xor x;
inc(t);
root[n]:=t;
add(n,b[n]);
end
else begin
readln(l,r,x);
x:=x xor b[n];
writeln(ask(l-,r-,x));
end;
end;
end.
bzoj3261的更多相关文章
- 【BZOJ3261】最大异或和 Trie树+贪心
[BZOJ3261]最大异或和 Description 给定一个非负整数序列 {a},初始长度为 N. 有 M个操作,有以下两种操作类型:1 .A x:添加操作,表示在序列末尾添加一个 ...
- [BZOJ3261&BZOJ3166]可持久化trie树及其应用
可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...
- BZOJ3261 最大异或和 (可持久化Trie)
; len=; var x,y,z,n,m,tot,lx,i:longint; sum:..maxn] of longint; rt:..maxn] of longint; time,l,r:..ma ...
- bzoj3261: 最大异或和
可持久化trie.又是%%%Xs酱... #include<cstdio> #include<cstring> #include<iostream> #includ ...
- bzoj3261 可持久化trie
容易想到题解. 总结一下区间异或和题: 1.转化成trie 2.注意空间稍微开大 3.不要一个数右移31位 4.考虑开头要不要插一个零 5.注意可持久get的时候区间是左开右闭,但这样会变成x-2,x ...
- ⌈洛谷4735⌋⌈BZOJ3261⌋最大异或和【可持久化01Trie】
题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护 ...
- BZOJ3261最大异或和——主席树
题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p ...
- bzoj3261: 最大异或和 可持久化trie
题意:给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...
- 2018.08.04 bzoj3261: 最大异或和(trie)
传送门 简单可持久化01trie树. 实际上这东西跟可持久化线段树貌似是一个东西啊. 要维护题目给出的信息,就需要维护前缀异或和并且把它们插入一棵01trie树,然后利用贪心的思想在上面递归就行了,因 ...
随机推荐
- JPA entity versioning (@Version and Optimistic Locking)
详情见: http://www.byteslounge.com/tutorials/jpa-entity-versioning-version-and-optimistic-locking
- RMQ问题与ST算法
RMQ(Range Minimum/Maximum Query)问题是求区间最值问题. 对于长度为 n 的数组 A,进行若干次查询,对于区间 [L,R] 返回数组A中下标在 [L,R] 中的最小(大) ...
- C#面向对象(二)
一:抽象方法 1. 在面向对象编程语言中抽象方法指一些只有方法声明,而没有具体方法体的方法.抽象方法一般存在于抽象类或接口中. 在一些父类中,某些行为不是非常明确,因此无法用代码来具体实现,但是类还必 ...
- 《转载》CSS中的三种样式来源:创作人员、读者和用户代理
CSS中的样式一共有三种来源:创作人员.读者和用户代理,来源的不同会影响到样式的层叠方式,很多第一次学习CSS的朋友,对这三种来源可能会存在一些困惑,下面我写一下自己的理解,若有错误的地方还请指正. ...
- c# 获取MAC IP TCP列表
转载自baidu:http://hi.baidu.com/jackeyrain/item/ff94efcfd5cf3a3099b498e9 namespace Public { public clas ...
- EF收集
http://www.cnblogs.com/end/archive/2011/08/18/2144250.html http://www.cnblogs.com/zzdfc/archive/2009 ...
- VMWare ESX Server
VMWare ESX Server 4.1 全套下载 [转自:http://www.awolf.net/content/hack/vmware-esx-server-4-1-all-download. ...
- 开源字体包缩减font-spider
最近公司产品用微软雅黑,被告~ 领导要求产品后台系统必须更换字体,美工给了个宋体,个人觉得太丑,就网上搜了些处理方法使用 CSS属性 @font-face 自定义字体, 最后决定用 思源黑体 (思源 ...
- ZOJ 2432 Greatest Common Increasing Subsequence(最长公共上升子序列+路径打印)
Greatest Common Increasing Subsequence 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problem ...
- C++学习笔记-1-自增和自减运算符
1. post-increment and pre-increment 的区别 来源:http://www.c4learn.com/c-programming/c-increment-operator ...