51nod 1295 XOR key | 可持久化Trie树
51nod 1295 XOR key
这也是很久以前就想做的一道板子题了……学了一点可持久化之后我终于会做这道题了!
给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R)。求A[L] 至 A[R] 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值是多少?
Input
第1行:2个数N, Q中间用空格分隔,分别表示数组的长度及查询的数量(1 <= N <= 50000, 1 <= Q <= 50000)。
第2 - N+1行:每行1个数,对应数组A的元素(0 <= A[i] <= 10^9)。
第N+2 - N+Q+1行:每行3个数X, L, R,中间用空格分隔。(0 <= X <= 10^9,0 <= L <= R < N)
Output
输出共Q行,对应数组A的区间[L,R]中的数与X进行异或运算,所能得到的最大值。
可持久化Trie树,就类似于昨天我写的可持久化线段树。
每次想要修改一个节点的时候,不直接在原来的节点上进行修改,而是在旁边新建一个点,复制原来点的信息,并在新点上面修改。每次通过访问历史根节点来访问历史版本。
配合离线询问,然后从左往右把数组中的数加入Trie树中,对于每个询问[l, r],可以通过第r棵Trie树与第l - 1棵Trie树相减得到区间中新建出来的Trie树,在上面进行正常的异或最大查询即可。
时间、空间复杂度都是\(O(32*(n + Q))\)。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef unsigned long long ll;
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
}
const int N = 50005, M = 3000000;
int n, Q, idx = 1, a[N], root[N] = {1}, son[M][2], sze[M];
void insert(int i, int x){
int now = root[i] = ++idx;
int old = root[i - 1];
for(int i = 31; i >= 0; i--){
sze[now] = sze[old] + 1;
if((x >> i) & 1) son[now][0] = son[old][0], son[now][1] = ++idx;
else son[now][1] = son[old][1], son[now][0] = ++idx;
now = son[now][(x >> i) & 1];
old = son[old][(x >> i) & 1];
}
sze[now] = sze[old] + 1;
}
int query(int l, int r, int x){
int old = root[l], now = root[r], ans = 0;
for(int i = 31; i >= 0; i--){
bool dir = (x >> i) & 1;
int delta_sze = sze[son[now][!dir]] - sze[son[old][!dir]];
if(delta_sze) now = son[now][!dir], old = son[old][!dir], ans = ans << 1 | 1;
else now = son[now][dir], old = son[old][dir], ans = ans << 1;
}
return ans;
}
int main(){
read(n), read(Q);
for(int i = 1; i <= n; i++)
read(a[i]);
for(int i = 1; i <= n; i++)
insert(i, a[i]);
int l, r, x;
while(Q--){
read(x), read(l), read(r);
write(query(l, r + 1, x)), enter;
}
return 0;
}
//P.S. 没看见原题中数组从0开始数,白检查半天……
//错误:数组开小了……要不下次用指针吧……?
51nod 1295 XOR key | 可持久化Trie树的更多相关文章
- 51nod 1295 XOR key (可持久化Trie树)
1295 XOR key 题目来源: HackerRank 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个长度为N的正整数数组A,再给出Q个查 ...
- [多校联考2019(Round 4 T1)][51nod 1295]Xor key(可持久化trie)
[51nod 1295]Xor key(可持久化trie) 题面 给出一个长度为n的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] 至 A[R] ...
- 51nod 1295 XOR key 可持久化01字典树
题意 给出一个长度为\(n\)的正整数数组\(a\),再给出\(q\)个询问,每次询问给出3个数,\(L,R,X(L<=R)\).求\(a[L]\)至\(a[R]\)这\(R-L+1\)个数中, ...
- 51nod1295 XOR key(可持久化trie)
1295 XOR key题目来源: HackerRank基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个长度为N的正整数数组A,再给出Q个查询,每个查 ...
- BZOJ5338 [TJOI2018] Xor 【可持久化Trie树】【dfs序】
题目分析: 很无聊的一道题目.首先区间内单点对应异或值的询问容易想到trie树.由于题目在树上进行,case1将路径分成两段,然后dfs的时候顺便可持久化trie树做询问.case2维护dfs序,对d ...
- 51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)
1295 XOR key 2 秒 262,144 KB 160 分 6 级题 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] ...
- [TJOI2018] Xor 异或 (可持久化Trie,树链剖分)
题目描述 现在有一颗以 1 为根节点的由 n 个节点组成的树,树上每个节点上都有一个权值 \(v_i\).现在有 Q 次操作,操作如下: 1 x y :查询节点 x 的子树中与 y 异或结果的最大值. ...
- 可持久化Trie树初步
可持久化Trie树和可持久化线段树很像,依次插入信息,通过减法来进行历史版本查询. 2015年11月27日 bzoj3261 最大异或和 我们需要计算 a[p] xor a[p+1] xor ... ...
- 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块
题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...
随机推荐
- shentou mianshiti
给你一个网站你是如何来渗透测试的? 在获取书面授权的前提下.1)信息收集,1,获取域名的whois信息,获取注册者邮箱姓名电话等.2,查询服务器旁站以及子域名站点,因为主站一般比较难,所以先看看旁站有 ...
- css忽略某一层的存在:pointer-events:none
其实早知道这个属性,但是一直没有去研究过.今天正好在twitter看到这个词,就去研究了下,正好解决了目前遇到的一个小难题,所以分享下.嗯,其实这是个比较简单的CSS3属性. 在某个项目中,很多元素需 ...
- STUN, TURN, ICE介绍
STUN STUN协议为终端提供一种方式能够获知自己经过NAT映射后的地址,从而替代位于应用层中的私网地址,达到NAT穿透的目的.STUN协议是典型的Client-Server协议,各种具体应用通过嵌 ...
- 国密算法--Openssl 实现国密算法(基础介绍和产生秘钥对)
国密非对称加密算法 又称sm2,它是采取了ECC(曲线加密算法)中的一条固定的曲线,实际上就是ECC算法. 因为openssl里面不包含sm2算法,所以就要重新进行封装-. - 对于ECC算法我就不介 ...
- 基于tensorflow实现mnist手写识别 (多层神经网络)
标题党其实也不多,一个输入层,三个隐藏层,一个输出层 老样子先上代码 导入mnist的路径很长,现在还记不住 import tensorflow as tf import tensorflow.exa ...
- SQL-Server collation, what is it and how to change db/column collation
The thing about collations is that although database have it's own collation, every table, and every ...
- umask命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/stpeace/article/details/45509425 umask命令用得相对不多, 而umask函 ...
- [C#] 取得每月第一天和最後一天、某月总天数
思路: 1. DateTime dt= DateTime.Now; //获取当前时间 eg:2013-09-08 09:25:0 0 2. DateTime dt1 = new DateTime(d ...
- TeamWork#3,Week5,Scrum Meeting 11.6, 11.7, 11.11, 11.12
11.6:到目前为止基本已完成相关知识的学习,各方面工作都开始进行,一开始进行比较慢. 11.7:项目遇到困难,需要补充相关知识,进度慢了下来. 11.11:各方面工作进展比较顺利,没有什么大问题. ...
- 《JavaScript》数组Array
构造函数 var arr1 = new Array();// [] 空数组 var arr2 = new Array(3);//定义长度,0是空数组 var arr3 = new Array(1,2, ...