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 ...
随机推荐
- tp查找某字段,排除某字段,不用一次写那么多
更多的情况下我们都是查询某些字段,但有些情况下面我们需要通过字段排除来更方便的查询字段,例如文章详细页,我们可能只需要排除status和update_time字段,这样就不需要写一堆的字段名称了(有些 ...
- 基于FPGA的HDTV视频图像灰度直方图统计算法设计
随着HDTV的普及,以LCD-TV为主的高清数字电视逐渐进入蓬勃发展时期.与传统CRT电视不同的是,这些高清数字电视需要较复杂的视频处理电路来驱动,比如:模数转换(A/D Converter).去隔行 ...
- 【hdu3033】分组背包(每组最少选一个)
[题意] 有S款运动鞋,一个n件,总钱数为m,求不超过总钱数且每款鞋子至少买一双的情况下,使价值最大.如果有一款买不到,就输出“Impossible". 1<=N<=100 1 ...
- hdu 2157 How many ways?? ——矩阵十题第八题
Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, ...
- python初步学习-python数据类型之strings(字符串)
数据类型-字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号(''或者"")来创建字符串 var1 = 'Hello World!' var2 = "P ...
- VMware Workstation Pro 14 序列号
VMware Workstation Pro 14 序列号: AA702-81D8N-0817Y-75PQT-Q70A4 YC592-8VF55-M81AZ-FWW5T-WVRV0 FC78K-FKE ...
- python进行机器学习(一)之数据预处理
一.加载数据 houseprice=pd.read_csv('../input/train.csv') #加载后放入dataframe里 all_data=pd.read_csv('a.csv', h ...
- 【DeepLearning学习笔记】Coursera课程《Neural Networks and Deep Learning》——Week1 Introduction to deep learning课堂笔记
Coursera课程<Neural Networks and Deep Learning> deeplearning.ai Week1 Introduction to deep learn ...
- C语言restrict限定符
restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其 ...
- python基础===利用PyCharm进行Python远程调试(转)
原文链接:利用PyCharm进行Python远程调试 背景描述 有时候Python应用的代码在本地开发环境运行十分正常,但是放到线上以后却出现了莫名其妙的异常,经过再三排查以后还是找不到问题原因,于是 ...