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树,然后利用贪心的思想在上面递归就行了,因 ...
随机推荐
- java 函数形参传值和传引用的区别
java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...
- NHibernate动态加载资源文件
最近做项目,又用到了以前做过的ORM框架--NHibernate. 此次想要实现的目标: 1.简单SQL用NHibernate的Session的CRUD方法实现 2.复杂SQL用Native SQL实 ...
- jsp - 引用 jar包.
在jsp中使用不同的方式引用jar,准备的工作也不同.我接触过的有两种:1)直接在jsp页面中引用;2)在src下的java类中引用,然后在jsp中调用java类. 1)直接引用:可以将jar包丢到W ...
- Swift基础知识入门(基于Swift2.0)
//: Playground - noun: a place where people can play import UIKit // Swift中不需要设置main函数入口,编译器会在全局函数中自 ...
- CSS 尺寸 (Dimension)
CSS 尺寸 (Dimension) 属性允许你控制元素的高度和宽度.同样,它允许你增加行间距. 更多实例 设置元素的高度 这个例子演示了如何设置不同元素的高度. 使用百分比设置图像的高度 这个例子演 ...
- Lucene索引的初步创建
从百度上知道的,Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的 ...
- DateTimePicker时间控件:
DateTimePicker时间控件: http://xdsoft.net/jqplugins/datetimepicker/ 可以参考文档设置各种属性,格式. 用法: 首先下载datetimepic ...
- 界面信息获取库的封装,记有爱UI助手的诞生
距离上次写文章已经过去了10个月,这次把我最近做的一个东西的一些心得写下来吧. 上一篇文章写了MSAA技术对于QQ界面信息获取的相关知识,近一段时间我把这个技术包括一些其他的功能做了一个封装并准备公开 ...
- FileStream读写文件流
用FileStream 读取文件流并显示给文件内容 string p = @"C:\Users\Administrator\Desktop\1.txt"; FileStream f ...
- PS证件照换背景
综述 博主原创内容. 在PS里,对于抠图,比较有技术含量的便是抠头发丝了,下面为大家带来一个比较详细的抠头发丝的教程. 素材准备 在这里我们用这张图片作为抠图素材,下面让我们一步步来演示抠图的过程,并 ...