题目描述

Jim是一个热爱打游戏的小伙子,可惜他的游戏水平不太行,以至于经常在游戏里被别人欺负。而且Jim不仅游戏玩的菜,他还很爱喷人,但是由于自己的垃圾操作,他又喷不过别人。为了改善这种局面,Jim决定成为一个腿部挂件(俗称抱大腿)。
已知现在有N个选手可供Jim选择,每位选手的能力值为 ai。N位选手不一定每位选手都有时间配Jim玩游戏而且Jim的状态也时好时坏,所以Jim有Q个询问,每个询问是3个数X、L、R,求第L个人到第R个人这R-L+1个人中与Jim配合后的能力值最大是多少,Jim 与第i位选手配合后的能力值为ai与X进行异或运算(Xor)。

输入

第1行:2个数N, Q中间用空格分隔,分别表示选手个数及查询的数量(1≤N≤200000,1≤Q≤200000)。 
第2 行:共N个数为每个选手能力值中间用空格分隔,对应ai(0≤a[i]≤10^9)。 
第N+2 - N+Q+1行:每行3个数X, L, R,中间用空格分隔。(0≤X≤10^9,0≤L≤R<N)

输出

输出共Q行,对应每次询问所能得到的最大能力值。

样例输入

9 8
2 15 4 12 0 6 0 16 12
2 2 5
4 8 8
16 5 8
16 6 8
1 0 5
12 3 4
15 1 1
5 0 4

样例输出

14
8
28
28
14
12
0
10

提示

对于第一个询问 2 与{4 12 0} 最大的能力值组合为 2 xor 12 = 14 注意 L R标号从 0 开始

对于20%的数据保证 (1≤N≤5000, 1≤Q≤5000)。 
对于45%的数据保证 (1≤N≤50000, 1≤Q≤50000)。 
对于100%的数据保证 (1≤N≤200000, 1≤Q≤200000)。


题目大意:给出n个数,在给出m个查询,每次查询的形式是x,l,r,输出在闭区间[l,r]内与x异或后最大的结果

题目分析:这个题如果是按点给分制的题目,我们完全可以暴力跑过数据比较水的测试点,但当n和m比较大的时候,n*n的暴力就显然无法通过所有测试点了,因为之前学了一波如何线性查找任意两个数异或的最大值,知道了字典树可以处理异或最大值或最小值的问题,这个题也是那种问题的进阶版,因为涉及到了区间,所以也就需要将字典树可持久化,那么这个题目的正解也就是可持久化01字典树,构造完字典树后对应输出即可,第一次接触,挂个板子,以后若有需要再深入学习

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e5+100;int trie[N*32][2];int sum[N*32];int root[N];int cnt=1;//这里注意一定要从1开始,因为所有trie的初始化为0,如果第0号节点设上数了,会对后续节点产生影响void insert(int pre,int& cur,int step,int x)
{cur=cnt++;//新建一个版本 trie[cur][0]=trie[pre][0];trie[cur][1]=trie[pre][1];//复制前一个节点的信息sum[cur]=sum[pre]+1;//加上当前新建的链if(step<0)//x到最后一位了return;int to=(x>>step)&1;//提取出x的当前位insert(trie[pre][to],trie[cur][to],step-1,x);//递归建树
}int search(int l,int r,int step,int x)
{if(step<0)return 0;int to=(x>>step)&1;if(sum[trie[r][!to]]>sum[trie[l][!to]])//说明有可以异或的这条路 return search(trie[l][!to],trie[r][!to],step-1,x)+(1<<step);elsereturn search(trie[l][to],trie[r][to],step-1,x);
} int main()
{
//  freopen("input.txt","r",stdin);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int num;scanf("%d",&num);insert(root[i-1],root[i],30,num);}while(m--){int l,r,x;scanf("%d%d%d",&x,&l,&r);l++,r++;printf("%d\n",search(root[l-1],root[r],30,x));}return 0;
}

中石油训练赛 - 腿部挂件(可持久化字典树)相关推荐

  1. 中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树,以点 1 为根,现在对于每个节点作为根的子树求解:子树中有多少个编号不相交的连续子段,如:1 2 4 5 7,共有三个连续的段,分别为 [ 1 ...

  2. 中石油训练赛 - Trading Cards(最大权闭合子图)

    题目大意:给出 n 个卡片,可以自由买卖,且价格都是相同的,再给出 m 个集合,如果已经得到了其中一个集合中的卡片,那么可以获得该集合的收益,问如何操作可以使得收益最大化 题目分析:最大权闭合子图的模 ...

  3. 中石油训练赛 - Watch Later(状压dp)

    题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...

  4. 中石油训练赛 - Swapping Places(字典序最小的拓扑排序)

    题目链接:点击查看 题目大意:给出 s 个字符串表示种类,再给出 m 个朋友关系,表示两个种类的动物是朋友,现在给出一个长度为 n 的种类排列,规定相邻两个是朋友的种类的动物可以交换位置,问如何操作, ...

  5. 中石油训练赛 - Gone Fishing(固定大小的圆可以覆盖最多的点)

    题目大意:在二维平面中给出 n 个点,再给出一个固定大小的圆,问如何放置这个圆可以使其覆盖最多的点 题目分析:首先不难想到一种 n^3 的做法,就是两层循环去枚举两个点,因为两个不同的点就可以确定下来 ...

  6. 中石油训练赛 - Check List(线段树维护偏序问题)

    题目大意:给出 n 个点,需要计算出满足下列条件的三元对 ( i , j , k ) 的数量: x[ i ] < x[ j ] < x[ k ] y[ k ] > y[ i ] &g ...

  7. 中石油训练赛 - Bad Treap(数学)

    题目链接:点击查看 题目大意:给出笛卡尔树的定义,现在要求给出 n 个点对 ( x , sin( x ) ),使得笛卡尔树的高度尽可能大 题目分析:如果想让笛卡尔树的高度尽可能大,令其退化为一条链即可 ...

  8. 中石油训练赛 - High Load Database(二分+记忆化)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列,再给出 m 次询问,每次询问给出一个阈值 x ,问最少将数列分割成多少段,可以使得每一段的总和都不超过 x,无解的话输出 Impossible ...

  9. 中石油训练赛 - Plan B(点双缩点+树形dp)

    题目大意:给出一张 n 个点 m 条边的无向连通图,现在有某些点被标记了,问能否通过删除某个未被标记的点,使得删除该点后的数个互不相交的连通块中,至少存在一个联通块中不含有被标记的点 题目分析:首先不 ...

最新文章

  1. Configure,Makefile.am, Makefile.in, Makefile文件之间关系
  2. Android Studio的Gradle常用命令配置和依赖管理
  3. 我的首页收藏链接之07年前的LIST
  4. python自动写作软件_开发了一款写作软件(OSX,Windows),附带Electron开发指南
  5. 我历时3年才写了10余篇源码文章,但收获了100w+阅读
  6. LeetCode 91. 解码方法(动态规划)
  7. python面试题之如何用Python输出一个斐波那契数列
  8. 狄慧201771010104《面向对象程序设计(java)》第八周学习总结
  9. java语言与c++语言相比_最突出的特点是_Java 语言与C++语言相比,最突出的特点是( )。_学小易找答案...
  10. matlab不用循环,三维矩阵按横切页(垂直于纸面且)向右展开为2维,即(i,j,:)展开。将二维矩阵每行顺序不变依次向左复制,如:(a,b,c)复制为(a,a,a,b,b,b,c,c,c)
  11. 广电光猫超级管理员账号及光猫改桥接模式教程
  12. MySQL配置文件详解
  13. 对称加密算法和非对称加密算法的完美结合
  14. 18年12月计算机英语统考成绩查询,没查的抓紧,18年12月四六级成绩查询入口将关闭...
  15. 如何让DIV中的内容左边的靠左对齐,右边的靠右对齐?
  16. 多态综合案例——电脑的USB 接口
  17. 平台业务收款分账产品设计 - 退款退分账
  18. 你离心想事成只差一个计划 | 进击
  19. 用php开发扑克小游戏网页版,开发日记:KBEngine+Unity+php做个扑克小游戏(一)
  20. 云上SkyEye,数字未来——DISA决赛我们来了

热门文章

  1. Nacos自定义 namespace与group配置
  2. Nginx负载均衡策略之least_conn
  3. RabbitMQ direct交换机
  4. kubernetes-Deployment
  5. 回顾线程的竞争机制-重量级锁
  6. Spring源码分析前篇
  7. 数据验证和JSR303
  8. Hive的基本操作-创建分区表
  9. Zookeeper_实际应用讲解
  10. IDEA使用技巧整理