51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)
1295 XOR key
- 2 秒
- 262,144 KB
- 160 分
- 6 级题
收起
输入
第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)
输出
输出共Q行,对应数组A的区间[L,R]中的数与X进行异或运算,所能得到的最大值。
输入样例
15 8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
10 5 9
1023 6 6
33 4 7
182 4 9
181 0 12
5 9 14
99 7 8
33 9 13
输出样例
13
1016
41
191
191
15
107
47
Trie树的模板题,Trie树处理区间异或查值问题,一直都不会这种区间查找异或值的最大值,发现是可持久化Trie树,打扰了。
每个数建31个树,然后查询的时候从高位到低位找就OK了。
Trie树原理很好理解,5分钟就可以懂,但是代码我看的时候,不同版本虽然实现的功能是相同的,但是还是有差别的,输出来中间过程也没看懂,但是能想懂,就是和代码对不上。。。。打扰了。
多练习就好啦。
--------------------------------------------------------2019.2.19----------------------------------------------------------
今天闲来无事看了一下,突然发现懂了,可能以前傻了,改了一下代码,以前写的有点丑。。。
直接贴代码:
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+; int son[maxn<<][],sum[maxn<<],root[maxn],sz=;
//son每个节点指向的两个节点的位置,sum每个节点出现的次数,root每棵01Trie根节点的位置 void insert(int val,int &x,int pre)
{
x=++sz;int t=x;//新建一个版本
for(int i=;i>=;i--){
son[t][]=son[pre][];son[t][]=son[pre][];//当前版本的Trie节点指向前一个Trie版本的节点,复制,节省空间
sum[t]=sum[pre]+;
int j=(val>>i)&;
son[t][j]=++sz;//新开的节点
t=son[t][j];pre=son[pre][j];
}
sum[t]=sum[pre]+;
} int query(int val,int x,int y)
{
int ans=;
for(int i=;i>=;i--){
int j=(val>>i)&;
if(sum[son[y][j^]]-sum[son[x][j^]]>){//说明比之前的版本大
ans|=(<<i);//当前位两者异或一定为1,找最大值嘛
x=son[x][j^];y=son[y][j^];
}
else{
x=son[x][j];y=son[y][j];
}
}
return ans;
} int main()
{
int n,m,x;
cin>>n>>m;
for(int i=;i<=n;i++){
cin>>x;
insert(x,root[i],root[i-]);//以元素下标作为版本号
}
while(m--){
int l,r;
cin>>x>>l>>r;
l++;r++;
cout<<query(x,root[l-],root[r])<<endl;
}
return ;
}
51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)的更多相关文章
- 51nod 1295 XOR key | 可持久化Trie树
51nod 1295 XOR key 这也是很久以前就想做的一道板子题了--学了一点可持久化之后我终于会做这道题了! 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X ...
- [多校联考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 (可持久化Trie树)
1295 XOR key 题目来源: HackerRank 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个长度为N的正整数数组A,再给出Q个查 ...
- 区间第K小——可持久化线段树模板
概念 可持久化线段树又叫主席树,之所以叫主席树是因为这东西是fotile主席创建出来的. 可持久化数据结构思想,就是保留整个操作的历史,即,对一个线段树进行操作之后,保留访问操作前的线段树的能力. 最 ...
- 51nod 1295 XOR key 可持久化01字典树
题意 给出一个长度为\(n\)的正整数数组\(a\),再给出\(q\)个询问,每次询问给出3个数,\(L,R,X(L<=R)\).求\(a[L]\)至\(a[R]\)这\(R-L+1\)个数中, ...
- 51Nod XOR key —— 区间最大异或值 可持久化字典树
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1295 1295 XOR key 题目来源: HackerRa ...
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- 可持久化01Trie树【p4735(bzoj3261)】最大异或和
Description 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N ...
- 【bzoj3689】异或之 可持久化Trie树+堆
题目描述 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n ...
随机推荐
- [技巧篇]19.InputStream与String,Byte之间互转[转载]
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...
- PHP扩展--Oracle客户端(oci8)安装
下载Oracle客户端 官方下载地址: Linux X86-64 同意协议,下载以下文件: oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm ...
- Jmeter-12-如何使用Plugin Manager
1. 搜索 Jmeter plugin 并找到plugin manager 下载jar文件 2. 放到jmeter/lib/ext下面, 重启jmeter 3. 找到选项-> Plugin ma ...
- free命令buff和cache的区别
[root@iz8vb8kca7twx6177bqg0fz ~]# free -h total used free shared b ...
- 使用TSQL语句操作MySQL数据库
使用TSQL语句创建数据库 以前用的是鼠标在界面上手动创建,这样创建会比较麻烦,而且还会经常出问题.在其它电脑上要用的话还需要重复操作.所以要使用程序代码操作,能通过代码的就不用手动操作. 在数据库界 ...
- Vuejs - 工欲善其事必先利其器
既然是实战,怎离不开项目开发的环境呢?先给大家推荐下我的个人开发环境: 硬件设备:Mac OSX编译器:Visual Studio Code命令行工具:iTerm2调试工具:Chrome Dev to ...
- window对象的方法和属性汇总
window对象有以下方法: open close alert confirm prompt setTimeout clearTimeout setInterval clearInterval mov ...
- markdown===在新窗口中打开网址的解决办法,以及其他遗留问题!
[超链接文字](url){:target="_blank"} 遗留问题: 如何设置图片的尺寸 我的复选框一直不生效,why? 公式 $$ 公式 $$ 不生效 如何设置代码块的背景颜 ...
- 设计模式之笔记--建造者模式(Builder)
建造者模式(Builder) 定义 建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 类图 描述 Builder:定义一个建造者抽象类,以规范产 ...
- clearcase command (windows 常用的几个)
command 1. setview 指定某个view你可以操作,否则你将看不到文件,ls,cd 等其它命令无效 setview viewname 2. rename branch type na ...