题目大意:给定一个长度为 N 的序列,支持两个操作:在序列末尾添加一个新的数字,查询序列区间 \([l,r]\) 内使得 \(a_p\oplus a_{q+1}\oplus ... a_N\oplus x\) 值最大。

题解:由于是查询区间的最大异或值,可知应该使用可持久化数据结构,再由于是最大异或和,可知采用可持久化 Trie + 前缀和处理。在 Trie 的每个节点上维护一个 size,表示该节点是多少个数字的二进制前缀,查询过程类似于主席树。

代码如下

#include <bits/stdc++.h>

using namespace std;

const int maxn = 6e5 + 10;

struct node {
node *l, *r;
int sz;
void pull() {
this->sz = 0;
if (l != NULL) {
this->sz += l->sz;
}
if (r != NULL) {
this->sz += r->sz;
}
}
} pool[maxn * 24];
node *newnode() {
static int cnt = 0;
return &pool[cnt++];
}
node *insert(node *pre, int bit, int val) {
node *cur = newnode();
if (pre) {
*cur = *pre;
}
if (bit < 0) {
cur->sz++;
return cur;
}
if (val >> bit & 1) {
cur->r = insert(pre ? pre->r : NULL, bit - 1, val);
} else {
cur->l = insert(pre ? pre->l : NULL, bit - 1, val);
}
cur->pull();
return cur;
}
int query(node *cur, node *pre, int bit, int val) {
if (bit < 0) {
return 0;
}
int now = val >> bit & 1;
if (now == 0) {
int rsz = 0;
if (cur && cur->r) rsz += cur->r->sz;
if (pre && pre->r) rsz -= pre->r->sz;
if (rsz > 0) {
return (1 << bit) + query(cur ? cur->r : NULL, pre ? pre->r : NULL, bit - 1, val);
} else {
return query(cur ? cur->l : NULL, pre ? pre->l : NULL, bit - 1, val);
}
} else {
int lsz = 0;
if (cur && cur->l) lsz += cur->l->sz;
if (pre && pre->l) lsz -= pre->l->sz;
if (lsz > 0) {
return (1 << bit) + query(cur ? cur->l : NULL, pre ? pre->l : NULL, bit - 1, val);
} else {
return query(cur ? cur->r : NULL, pre ? pre->r : NULL, bit - 1, val);
}
}
} int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
vector<int> sum(n + 1);
vector<node*> rt(n + 1);
rt[0] = insert(NULL, 25, 0);
for (int i = 1, x; i <= n; i++) {
cin >> x;
sum[i] = sum[i - 1] ^ x;
rt[i] = insert(rt[i - 1], 25, sum[i]);
}
while (m--) {
string opt;
cin >> opt;
if (opt[0] == 'A') {
int x;
cin >> x;
int val = sum.back() ^ x;
sum.push_back(val);
node *cur = insert(rt.back(), 25, val);
rt.push_back(cur);
} else {
int l, r, x;
cin >> l >> r >> x;
l--, r--;
if (l == 0) {
cout << query(rt[r], NULL, 25, x ^ sum.back()) << endl;
} else {
cout << query(rt[r], rt[l - 1], 25, x ^ sum.back()) << endl;
}
}
}
return 0;
}

【洛谷P4735】最大异或和的更多相关文章

  1. Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)

    题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...

  2. 洛谷 P4735 最大异或和 解题报告

    P4735 最大异或和 题目描述 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的 ...

  3. 【题解】洛谷P4735最大异或和

    学习了一下可持久化trie的有关姿势~其实还挺好理解的,代码也短小精悍.重点在于查询某个历史版本的trie树上的某条边是否存在,同样我们转化到维护前缀和来实现.同可持久化线段树一样,我们为了节省空间继 ...

  4. [洛谷P4735]最大异或和

    题目大意:有一串初始长度为$n$的序列$a$,有两种操作: $A\;x:$在序列末尾加一个数$x$ $Q\;l\;r\;x:$找一个位置$p$,满足$l\leqslant p\leqslant r$, ...

  5. 洛谷 P3359 改造异或树

    题目描述 给定一棵n 个点的树,每条边上都有一个权值.现在按顺序删掉所有的n-1条边,每删掉一条边询问当前有多少条路径满足路径上所有边权值异或和为0. 输入输出格式 输入格式: 第一行一个整数n. 接 ...

  6. 【洛谷 P4735】 最大异或和 (可持久化Trie)

    题目链接 维护整个数列的异或前缀和和\(s\),然后每次就是要求\(s[N]\text{^}x\text{^}s[k],l-1<=k<=r-1\)的最大值 如果没有\(l\)的限制,那么直 ...

  7. 洛谷P4462 [CQOI2018]异或序列(莫队)

    题意 题目链接 Sol 一开始以为K每次都是给出的想了半天不会做. 然而发现读错题了维护个前缀异或和然后直接莫队搞就行,. #include<bits/stdc++.h> #define ...

  8. 【洛谷P3917】异或序列

    题目大意:给定一个长度为 N 的序列,每个位置有一个权值,求 \[\sum\limits_{1\le i\le j\le n}(a_i\oplus a_{i+1}...\oplus a_j)\] 的值 ...

  9. 【洛谷P4462】异或序列

    题目大意:给定一个长度为 N 的序列,有 M 组询问,每组询问查询区间 [l,r] 内异或和等于给定常数 K 的区间组数. 题解:对于异或和问题,一般先进行前缀和处理,转化为两个点的的关系.因此,经过 ...

随机推荐

  1. Python_初识函数和返回值_22

    #len s = '金老板小护士' len(s) def my_len(): #自定义函数 i = 0 for k in s: i += 1 print(i) length = my_len() pr ...

  2. 【SE】Week17 : 软件工程课程总结

    软工课程总结  总算结束了一个学期大部分的事情,可以静下心来写篇软工的总结了. 在本学期的软工课程中,我担任的角色是Chronos团队的PM兼开发人员.在课程之前,我认为PM的角色应该还蛮轻松的,无非 ...

  3. Linux内核分析 读书笔记 (第三章)

    第三章 进程管理 3.1 进程 1.进程: 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 进程是处于执行期的程序以及相关的资源的总称. 进程包括代码段和其他资源. 2.线程:执行 ...

  4. Linux内核分析 读书笔记 (第五章)

    第五章 系统调用 5.1 与内核通信 1.调用在用户空间进程和硬件设备之间添加了一个中间层.该层主要作用有三个: 为用户空间提供了硬件的抽象接口. 系统调用保证了系统的稳定和安全. 实现多任务和虚拟内 ...

  5. 机器学习算法(KNN)

    KNN简介 KNN(k-NearestNeighbor)算法的思想总结一下:就是在数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K ...

  6. Use curl with uuid(uuidgen) under shell

    #!set uuidtmp = uuid.tmp #!uuidgen > $uuidtmp #!set uuid=<$uuidtmp #!rm $uuidtmp #!echo $uuid ...

  7. ODBC 驱动程序管理器 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配 解决方案

    程序报错如下: ---------------------------Microsoft 数据链接错误---------------------------测试连接失败,因为初始化提供程序时发生错误. ...

  8. Appium学习笔记4_元素定位方法

    Appium之元素定位,如果对Android上如何使用工具获取页面元素有问题的,请转战到这:http://www.cnblogs.com/taoSir/p/4816382.html. 下面主要是针对自 ...

  9. php 历史版本下载地址

    PHP 3.* 版本到 7.* 版本下载地址 http://www.php.net/releases/

  10. [转帖] BIO与NIO、AIO的区别

    培训里面讲的东西  自己查了下 啥意思,,, 转帖强化一下. http://blog.csdn.net/skiof007/article/details/52873421 IO的方式通常分为几种,同步 ...