可持久化Trie

需要知道一个异或的特点,和前缀和差不多

a[p] xor a[p+1] xor....xor a[n] xor x = a[p-1] xor a[n] xor x

所以我们把a[1...n]的异或和预处理出来,用s[i]表示,用一个可持久化Trie维护

问题就转化成s[n] xor x = val,求一个序列与val异或的最大值

第i个Trie的root对应维护s[1..i],这样我们在查询值的时候为了保证在[...r-1]之类,只要查询r-1及之前的版本

为了保证在[l-1...]内,我们还需要一个数组latest维护末尾节点是最近一次第几个s的末尾,查询的时候跳过小于l-1的版本即可

这题洛谷上卡常。。根据题目给的范围,24位二进制足够了,没必要开32位,节约时间。。还有各种inline,快读,尽量用上

为了保证能够查询[1..r],我们还需要给空树插入一个0,保证覆盖整个区间(类似主席树)

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
inline int lowbit(int x){ return x & (-x); }
inline int read(){
int X = 0, w = 0; char ch = 0;
while(!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
while(isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
return w ? -X : X;
}
inline int gcd(int a, int b){ return a % b ? gcd(b, a % b) : b; }
inline int lcm(int a, int b){ return a / gcd(a, b) * b; }
template<typename T>
inline T max(T x, T y, T z){ return max(max(x, y), z); }
template<typename T>
inline T min(T x, T y, T z){ return min(min(x, y), z); }
template<typename A, typename B, typename C>
inline A fpow(A x, B p, C lyd){
A ans = 1;
for(; p; p >>= 1, x = 1LL * x * x % lyd)if(p & 1)ans = 1LL * x * ans % lyd;
return ans;
}
const int N = 600005;
int n, m, trie[N*24][2], latest[N*24], s[N], root[N], tot; inline void insert(int k, int i, int p, int q){
if(i < 0){
latest[p] = k;
return;
}
int t = (s[k] >> i) & 1;
if(q) trie[p][t^1] = trie[q][t^1];
trie[p][t] = ++tot;
insert(k, i - 1, trie[p][t], trie[q][t]);
latest[p] = max(latest[trie[p][0]], latest[trie[p][1]]);
} inline int query(int cur, int i, int val, int lmt){
if(i < 0) return s[latest[cur]] ^ val;
int t = (val >> i) & 1;
if(latest[trie[cur][t^1]] >= lmt) return query(trie[cur][t^1], i - 1, val, lmt);
return query(trie[cur][t], i - 1, val, lmt);
} int main(){
memset(latest, -1, sizeof latest);
n = read(), m = read();
root[0] = ++tot;
insert(0, 23, root[0], 0);
for(int i = 1; i <= n; i ++){
s[i] = s[i - 1] ^ read();
root[i] = ++tot;
insert(i, 23, root[i], root[i - 1]);
}
while(m --){
char opt[2]; scanf("%s", opt);
if(opt[0] == 'A'){
int x = read();
root[++n] = ++tot, s[n] = s[n - 1] ^ x;
insert(n, 23, root[n], root[n - 1]);
}
else if(opt[0] == 'Q'){
int l = read(), r = read(), x = read();
printf("%d\n", query(root[r - 1], 23, s[n] ^ x, l - 1));
}
}
return 0;
}

BZOJ 3261 最大异或和(算竞进阶习题)的更多相关文章

  1. BZOJ 1977 严格次小生成树(算竞进阶习题)

    树上倍增+kruskal 要找严格次小生成树,肯定先要找到最小生成树. 我们先把最小生成树的边找出来建树,然后依次枚举非树边,容易想到一种方式: 对于每条非树边(u,v),他会与树上的两个点构成环,我 ...

  2. BZOJ 1912 巡逻(算竞进阶习题)

    树的直径 这题如果k=1很简单,就是在树的最长链上加个环,这样就最大化的减少重复的路程 但是k=2的时候需要考虑两个环的重叠部分,如果没有重叠部分,则和k=1的情况是一样的,但是假如有重叠部分,我们可 ...

  3. BZOJ 1855 股票交易 (算竞进阶习题)

    单调队列优化dp dp真的是难..不看题解完全不知道状态转移方程QAQ 推出方程后发现是关于j,k独立的多项式,所以可以单调队列优化.. #include <bits/stdc++.h> ...

  4. BZOJ 2200 道路与航线 (算竞进阶习题)

    dijkstra + 拓扑排序 这道题有负权边,但是卡了spfa,所以我们应该观察题目性质. 负权边一定是单向的,且不构成环,那么我们考虑先将正权边连上.然后dfs一次找到所有正权边构成的联通块,将他 ...

  5. 洛谷P4178 Tree (算竞进阶习题)

    点分治 还是一道点分治,和前面那道题不同的是求所有距离小于等于k的点对. 如果只是等于k,我们可以把重心的每个子树分开处理,统计之后再合并,这样可以避免答案重复(也就是再同一个子树中出现路径之和为k的 ...

  6. POJ 3074 Sudoku(算竞进阶习题)

    二进制优化+dfs 话说这题数据中真的丧心病狂..不加inline还过不去.. 因为不会DLX只好用二进制来优化了...万万没想到还是低空飘过 我们在行.列.格分别用一个9位二进制常数来记录什么数能放 ...

  7. POJ 2449 Remmarguts' Date (算竞进阶习题)

    A* + dijkstra/spfa 第K短路的模板题,就是直接把最短路当成估价函数,保证估价函数的性质(从当前状态转移的估计值一定不大于实际值) 我们建反图从终点跑最短路,就能求出从各个点到终点的最 ...

  8. POJ 1821 Fence (算竞进阶习题)

    单调队列优化dp 我们把状态定位F[i][j]表示前i个工人涂了前j块木板的最大报酬(中间可以有不涂的木板). 第i个工人不涂的话有两种情况: 那么F[i - 1][j], F[i][j - 1]就成 ...

  9. POJ 1015 Jury Compromise (算竞进阶习题)

    01背包 我们对于这类选或者不选的模型应该先思考能否用01背包来解. 毫无疑问物体的价值可以看成最大的d+p值,那么体积呢?题目的另一个限制条件是d-p的和的绝对值最小,这启发我们把每个物体的d-p的 ...

随机推荐

  1. Redis系列文章总结:ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁

    引言:最近回头看了看开发的.Net Core 2.1项目的复盘总结,其中在多处用到Redis实现的分布式锁,虽然在OnResultExecuting方法中做了防止死锁的处理,但在某些场景下还是会发生死 ...

  2. vue better-scroll用法

    滚动位置固定:在vue中通过路由切换页面时组件会自动滚动到顶部,需要监听滚动行为才能让滚动位置固定,better-scroll解决了这个问题. 常用效果:移动端很常见的效果,当滑动右边部分的时候,左边 ...

  3. python 获取lazada菲律宾站地址库

    import urllib3 import requests import ast import time # 因为lazada返回的数据是json类型,通过解码成字符串类型,为了方便数据操作,使用字 ...

  4. koa入门

    创建koa2工程 首先初始化项目 npm init -y 项目名称 安装koa $ npm i koa 我们创建一个目录hello-koa并作为工程目录用VS Code打开.然后,我们创建app.js ...

  5. CONTINUE...?模拟分情况

    CONTINUE...? DreamGrid has  classmates numbered from  to . Some of them are boys and the others are ...

  6. PHP实用代码片段(一)

    1. 发送 SMS 在开发 Web 或者移动应用的时候,经常会遇到需要发送 SMS 给用户,或者因为登录原因,或者是为了发送信息.下面的 PHP 代码就实现了发送 SMS 的功能. 为了使用任何的语言 ...

  7. Day13 Python基础之time/datetime/random模块一(十一)

    time模块 import time print(help(time)) time.time() #return current time in seconds since the Epoch as ...

  8. anaconda 出现add 。。。进不去

    找到.condarc 文件  C:\Users\leiyi内 把里面内容替换为 channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pk ...

  9. 使用jmeter来发送json/gzip格式数据 --------笔记

    一.使用jmeter来发送gzip数据 有时候我们需要模拟在客户端将数据压缩后, 发送(post)到服务器端. 通常这种情况,会发生在移动终端上. 这样做的好处, 是可以节省流量.  当然, 服务器返 ...

  10. javascript博客爱心特效代码与代码解析

    这个鼠标点击出现爱心的特效经常在别的博客里见到,于是我查了度娘后拿来直接用上了. 虽然不知道原作者是谁,但肯定是个大神,只有通过观摩他/她的代码膜拜一下啦. 直接上代码(解析在代码注释里): // 自 ...