Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面
题解
显然,如果让你查询整个数列的最大异或和,建一颗$01Trie$,每给定一个$p$,按照二进制后反方向跳就行了(比如当前二进制位为$1$,则往$0$跳,反之亦反)。
但是现在要支持在最末尾插入和区间查询,将这颗$Trie$可持久化一下就好了(可持久化$Trie$敲板)
#include <cstdio>
#include <cstring>
#include <algorithm>
using std::min; using std::max;
using std::sort; using std::swap;
typedef long long ll;
template<typename T>
void read(T &x) {
int flag = 1; x = 0; char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
}
const int N = 6e5 + 10;
int trie[N * 24][2], latest[N * 24];
int s[N], rt[N], n, m, tot;
void insert(int i, int k, int p, int q) { // q -> p s[i][k]
if(k < 0) { latest[q] = i; return ; }
int c = (s[i] >> k) & 1;
if(p) trie[q][c ^ 1] = trie[p][c ^ 1];
trie[q][c] = ++tot;
insert(i, k - 1, trie[p][c], trie[q][c]);
latest[q] = max(latest[trie[q][0]], latest[trie[q][1]]);
}
int query(int now, int val, int k, int limit) {
if(k < 0) return s[latest[now]] ^ val;
int c = (val >> k) & 1;
if(latest[trie[now][c ^ 1]] >= limit)
return query(trie[now][c ^ 1], val, k - 1, limit);
else return query(trie[now][c], val , k - 1, limit);
}
int main () {
read(n), read(m);
latest[0] = -1, rt[0] = ++tot;
insert(0, 23, 0, rt[0]);
for(int i = 1; i <= n; ++i) {
int x; read(x);
s[i] = s[i - 1] ^ x, rt[i] = ++tot;
insert(i, 23, rt[i - 1], rt[i]);
}
for(int i = 1; i <= m; ++i) {
char opt[3]; scanf("%s", opt);
if(opt[0] == 'A') {
int x; read(x);
rt[++n] = ++tot, s[n] = s[n - 1] ^ x;
insert(n, 23, rt[n - 1], rt[n]);
} else {
int l, r, x; read(l), read(r), read(x);
printf("%d\n", query(rt[r - 1], x ^ s[n], 23, l - 1));
}
}
return 0;
}
Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)的更多相关文章
- 洛谷P4592 [TJOI2018]异或 【可持久化trie树】
题目链接 BZOJ4592 题解 可持久化trie树裸题 写完就A了 #include<algorithm> #include<iostream> #include<cs ...
- 洛谷 P4735 最大异或和 解题报告
P4735 最大异或和 题目描述 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的 ...
- 【题解】洛谷P4735最大异或和
学习了一下可持久化trie的有关姿势~其实还挺好理解的,代码也短小精悍.重点在于查询某个历史版本的trie树上的某条边是否存在,同样我们转化到维护前缀和来实现.同可持久化线段树一样,我们为了节省空间继 ...
- [洛谷P4735]最大异或和
题目大意:有一串初始长度为$n$的序列$a$,有两种操作: $A\;x:$在序列末尾加一个数$x$ $Q\;l\;r\;x:$找一个位置$p$,满足$l\leqslant p\leqslant r$, ...
- 【洛谷P4735】最大异或和
题目大意:给定一个长度为 N 的序列,支持两个操作:在序列末尾添加一个新的数字,查询序列区间 \([l,r]\) 内使得 \(a_p\oplus a_{q+1}\oplus ... a_N\oplus ...
- 【洛谷 P4735】 最大异或和 (可持久化Trie)
题目链接 维护整个数列的异或前缀和和\(s\),然后每次就是要求\(s[N]\text{^}x\text{^}s[k],l-1<=k<=r-1\)的最大值 如果没有\(l\)的限制,那么直 ...
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
- 洛谷 P3359 改造异或树
题目描述 给定一棵n 个点的树,每条边上都有一个权值.现在按顺序删掉所有的n-1条边,每删掉一条边询问当前有多少条路径满足路径上所有边权值异或和为0. 输入输出格式 输入格式: 第一行一个整数n. 接 ...
- [洛谷P4592][TJOI2018]异或
题目大意:有一棵$n$个点的树,第$i$个点权值为$w_i$,有两种操作: $1\;x\;y:$询问节点$x$的子树中与$y$异或结果的最大值 $2\;x\;y\;z:$询问路径$x$到$y$上点与$ ...
随机推荐
- Linux_创建母版,快速克隆,如何移动虚拟机.ziw
2017年1月9日, 星期一 Linux_创建母版,快速克隆,如何移动虚拟机 1. 安裝虚拟机 2. 建立母版——第一次启动虚拟机 2.1 设置网卡为NAT模式 2. ...
- javascript在IE下不能用 trim函数解决方法
javascript 的trim 函数在firefox 下面使用没有问题 <script language="javascript"> var test1 = &quo ...
- layer弹窗的跳转功能
1,本弹窗直接跳转父页面: @if(session('message')) <script> window.parent.location.reload(); //刷新父页面 var in ...
- 使用infinite-scroll实现Ghost博文列表的滚动加载
Ghost博客系统默认提供的博文列表为传统的翻页方式(通过点击上一页.下一页等按钮来切换),随着移动客户端的发展,瀑布流式的滚动加载方式得到广泛应用,有效地提高了用户浏览信息的流畅度.下面详述如何通过 ...
- Java 注解全面解析
1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...
- 在Oracle中查询表的大小
SELECT segment_name AS TABLENAME,round(BYTES/1024/1024,2) FROM user_segments WHERE segment_name='表名 ...
- Linux下的压缩解压缩
Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲t ...
- MongoDB之主从复制和副本集(四)
简单主从复制 采用一主一从或一主多从的布署模式,可以将读写分离开来,提高数据库的可用性,不过mongodb的主从模式并不能在主节点崩溃后,从节点替换主节点的工作,一般可以在开发阶段使用. 实现步骤 设 ...
- React 16 源码瞎几把解读 【三 点 二】 react中的fiberRoot
〇.先来看看常用的常量 NoWork = 0 noTimeout = undefined HostRoot = 3 NoContext = 0b000; AsyncMode = 0b001; Stri ...
- spring boot注解学习记
@Component Compent等效于xml文件中的Bean标注,Autowired自动初始化Bean是通过查找Component注解实现的,在增加Component后还是Autowired找不到 ...