【洛谷P4735】最大异或和
题目大意:给定一个长度为 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】最大异或和的更多相关文章
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
- 洛谷 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$, ...
- 洛谷 P3359 改造异或树
题目描述 给定一棵n 个点的树,每条边上都有一个权值.现在按顺序删掉所有的n-1条边,每删掉一条边询问当前有多少条路径满足路径上所有边权值异或和为0. 输入输出格式 输入格式: 第一行一个整数n. 接 ...
- 【洛谷 P4735】 最大异或和 (可持久化Trie)
题目链接 维护整个数列的异或前缀和和\(s\),然后每次就是要求\(s[N]\text{^}x\text{^}s[k],l-1<=k<=r-1\)的最大值 如果没有\(l\)的限制,那么直 ...
- 洛谷P4462 [CQOI2018]异或序列(莫队)
题意 题目链接 Sol 一开始以为K每次都是给出的想了半天不会做. 然而发现读错题了维护个前缀异或和然后直接莫队搞就行,. #include<bits/stdc++.h> #define ...
- 【洛谷P3917】异或序列
题目大意:给定一个长度为 N 的序列,每个位置有一个权值,求 \[\sum\limits_{1\le i\le j\le n}(a_i\oplus a_{i+1}...\oplus a_j)\] 的值 ...
- 【洛谷P4462】异或序列
题目大意:给定一个长度为 N 的序列,有 M 组询问,每组询问查询区间 [l,r] 内异或和等于给定常数 K 的区间组数. 题解:对于异或和问题,一般先进行前缀和处理,转化为两个点的的关系.因此,经过 ...
随机推荐
- [T-ARA][ORGR]
歌词来源:http://music.163.com/#/song?id=29343993 作曲 : 4번타자/에스킴 [作曲 : 4p/beon-Ta-c/ja-/e-seu-Kim] 作词 : 4번 ...
- linux-安装-源码安装
编译安装 tengine
- Beta版本发布报告
项目名称 学霸系统写手机客户端 项目版本 Beta版本 负责人 北京航空航天大学计算机学院 hots团队 联系方式 http://www.cnblogs.com/hotsbuaa/ 要求发布日期 20 ...
- 第三次Sprint-最后冲刺
由于一些原因,导致我和汝婷被退队了.因此我们是从上星期重新开始做系统. 陈汝婷单独负责: 1.用户输入题目数: 2.限制题数: 3.自动生成用户需要题目数的题目: 4.计时 练丽云单独: 1.异常处理 ...
- 第三个spring冲刺第9天
今天是第三阶段冲刺的最后第二天了,我们该实现的功能基本已经全部实现了,有填空的,选择题的,还有计时的,目前就是在查BUG,看看有哪些地方有BUG需要修改,以下截图是我们团队所做的功能截图: 首页: 填 ...
- beta版验收互评
排名 团队名称 项目名称 优点 缺点,bug 报告 1 别看了你没救了队 校园帮帮帮(已发布) 实现普通用户的登陆,修改个人信息,发布信息,下订单的功能:管理员登陆,修改个人信息,发布信息,下订单,增 ...
- 深度学习中 --- 解决过拟合问题(dropout, batchnormalization)
过拟合,在Tom M.Mitchell的<Machine Learning>中是如何定义的:给定一个假设空间H,一个假设h属于H,如果存在其他的假设h’属于H,使得在训练样例上h的错误率比 ...
- 使用node去爬虫
let http = require('http'); let https = require('https');//引入node的https服务. let cheerio = require('ch ...
- pip和conda到底有什么不一样?
今天看到我的foreman开始报错去询问才发现.我们的python包管理工具已经从pip整体迁移到了conda..最近的迁移真的非常多..前端也在迁移打包
- Delphi 实现获取其他程序的子窗体
通过一个父窗体的句柄,递归的枚举它的子窗体,我们可以最终找到需要的子窗体. 用法如下: nParentHandle: HWnd; nChildHandle: HWnd; nParentHandle : ...