题目大意:给定一个长度为 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. Error【0007】:zabbix中因为curl版本过低而无法发送邮件

    1. 错误背景 在centos6.5上,源码部署zabbix最新版本zabbix-3.2.14.部署后之后,在配置邮件发送报警时出错 2. 错误提示 3. 原因分析 从网上检索的结果是说,系统中的cu ...

  2. centos7下部署iptables环境纪录(关闭默认的firewalle)

    CentOS7默认的防火墙不是iptables,而是firewall.由于习惯了用iptables作为防火墙,所以在安装好centos7系统后,会将默认的firewall关闭,并另安装iptables ...

  3. BAT大厂面试流程剖析

    在当今互联网中,虽然互联网行业从业者众多,不断崛起的互联网公司也会很多,但如BAT等大厂,仍然是很多同学想要进入的企业.那么本篇文章将会为大家很直白的讲解大厂的面试流程以及侧重点. 首先闲聊一下,为什 ...

  4. L2-027. 名人堂与代金券

    链接:名人堂与代金券 在比赛中这题只得了2分,赛后发现原来strcmp函数并不是只返回-1,0,1三种,而是返回正数负数0 但是在我的电脑上一般就是返回前三种,只是用后面的三种更稳妥点 都怪我基础不扎 ...

  5. 广商博客冲刺第四五天new

    第三天沖刺傳送門 第六七天沖刺傳送門 以上的前台设计架构已经完成了,现在来完成前台的安卓设计. 首先我们配置了Android SDK Manager 使得程序能在安卓环境下运行. 这就完成了前台安卓的 ...

  6. java — 静态绑定和动态绑定

    绑定:一个方法的调用与方法所在的类关联起来.java中的绑定分为静态绑定和动态绑定,又被称作前期绑定和后期绑定. 静态绑定:(final.static.private)在程序执行前已经被绑定,也就是说 ...

  7. css3-弹性盒模型

    first <style> .box{width:1024px;height:100px; border:5px solid black; padding:10px; display:-w ...

  8. logback基本入门

    1. logback的定义 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch.它当前分为下面下个模块: logback-core:其它 ...

  9. HTTP Client使用总结

    1.如果服务器使用HTTPS协议,使用HTTPClient的话,需要配以EasySSLProtocolSocketFactory 2.Tomcat对HTTP的Post和Get请求处理是不一样的.Spr ...

  10. Appium学习笔记3_Genymotion模拟器安装

    如果你已经配置好了安卓的运行环境,也配置好了自带的模拟器AVD,而且也launch了你的安卓模拟器,那么我相信你是不再愿意launch安卓模拟器第二次了,因为实在是太卡了(当然如果你电脑的配置够高,你 ...