补题地址:https://nanti.jisuanke.com/t/A1607

题目:


Consider an array A with n elements . Each of its element is A[i](1≤i≤n). Then gives two integers Q, K, and Q queries follow . Each query , give you L, R, you can get Z by the following rules.

To get Z , at first you need to choose some elements from A[L] to A[R] ,we call them A[i1],A[i2]…A[it] , Then you can get number Z=K or (A[i1] xor A[i2] … xor A[it​]) .

Please calculate the maximum ZZ for each query .

Input

Several test cases .

First line an integer T (1≤T≤10) . Indicates the number of test cases.Then T test cases follows . Each test case begins with three integer N, Q,K (1≤N≤10000, 1≤Q≤100000, 0≤K≤100000). The next line has N integers indicate A[1] to A[N] (0≤A[i]≤108). Then Q lines , each line two integer L,R (1≤L≤R≤N).

Output

For each query , print the answer in a single line.

样例输入

1
5 3 0
1 2 3 4 5
1 3
2 4
3 5

样例输出

3
7
7

解题思路:


求区间异或值or已知数k的最大值,区间问题,多次查询,要用到线段树,线段树的叶子节点是单个的线性基,非叶子都是合并后的线性基。

线性基的合并可以参考这道例题。

本题很关键的一个点:因为要求或之后的结果最大,k已知,那么k中为1的位或之后还是1,所以k中为0的那些位需要用区间异或值来弥补,这就是说,k中为0的那些位,在区间异或值中尽量为1,且求最大异或值时只考虑区间的数m 在k中为0的那些位。此时,我们不关心区间异或值是否取最大,或者取多少,只要最终的整个结果最大即可。

对k各位取反,在让区间中的值都和取反后的k做与运算,这样以后,原k中为1的那些位 在区间中的数上 都是0 (因为k中为1的位取反后是0,0和任何数与都是0),而区间的数中为1的位说明 原k中那些位为0,原数中那些位为1。所以最终答案就变成了求新区间的数的最大异或值(让原k中为0的那些位所表示的数最大),再与原k做或运算(原k中为1的那些位在最大异或值中都是0),举个例子试试吧。

ac代码:


#include <bits/stdc++.h>
using namespace std;
const int maxn=10005;
const int max_base=30;
typedef long long ll;
int a[maxn],xian[4*maxn][max_base+3],ans[max_base+3];
int n,q,k,t,L,R;
void update(int id)
{int x=id<<1,y=id<<1|1;memcpy(xian[id],xian[x],sizeof(xian[x]));//id的线性基初始化左子树的线性基for(int k=max_base;k>=0;k--){int tmp=xian[y][k];for(int j=max_base;j>=0 && tmp;j--){if(tmp>>j&1){if(xian[id][j])tmp^=xian[id][j];else{xian[id][j]=tmp;break;}}}}
}
void build(int l,int r,int id)
{if(l==r){for(int i=max_base;i>=0;i--)if(a[l]>>i&1){if(xian[id][i])a[l]^=xian[id][i];else{xian[id][i]=a[l];break;}}return ;}int mid=(l+r)>>1;build(l,mid,id<<1);build(mid+1,r,id<<1|1);update(id);
}
void query(int l,int r,int x,int y,int id)//要查的区间为(x,y)
{if(x<=l && r<=y)//如果区间不能直接查到的话,线性基合并,合并的结果存入ans【】中{for(int k=max_base;k>=0;k--){int tmp=xian[id][k];for(int j=max_base;j>=0 && tmp;j--){if(tmp>>j&1){if(ans[j])tmp^=ans[j];else{ans[j]=tmp;break;}}}}return ;//记得写!}int mid=(l+r)>>1;if(x<=mid) query(l,mid,x,y,id<<1);if(y>=mid+1) query(mid+1,r,x,y,id<<1|1);
}
int main() {//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);scanf("%d",&t);while(t--){memset(xian,0,sizeof(xian));scanf("%d %d %d",&n,&q,&k);k=~k;for(int i=1;i<=n;i++){scanf("%d", &a[i]);a[i]&=k;}k=~k;build(1,n,1);while(q--){scanf("%d %d",&L,&R);memset(ans,0,sizeof(ans));query(1,n,L,R,1);int res=0;for(int i=max_base;i>=0;i--)res=max(res,res^ans[i]);printf("%d\n",res|k);}}return 0;
}

【2017西安邀请赛:A】XOR(区间异或最大值多次查询---线段树+线性基合并)相关推荐

  1. 线段树 ---- 牛客多校4 ETree Xor 区间异或分段

    题目链接 题目大意: 就是给你nnn个节点的树,树上每个节点都有一个权值wi∈[li,ri]w_i\in[l_i,r_i]wi​∈[li​,ri​],以及相邻(u,v)(u,v)(u,v)的异或值wu ...

  2. 洛谷 - P6292 区间本质不同子串个数(SAM+LCT+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的字符串,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 内有多少个本质不同的字符串 题目分析:首先简化模型,回顾一下如何求解 &quo ...

  3. 美登杯”上海市高校大学生程序设计邀请赛 Problem E 、 小 花梨 的数组 (线段树)...

    Problem E E . 小 花梨 的数组 时间限制:1000ms 空间限制:512MB Description 小花梨得到了一个长度为?的数组?,现在要对它进行三种操作: ⚫ 1 ? ] ∗ ⚫ ...

  4. 【BZOJ 4671】异或图 【斯特林反演】【线性基】【贝尔数复杂度】

    传送门 题意:定义两个图的异或的边集为在两张图中恰出现一次的边.给sss张nnn个点的图的集合,求异或和为连通图的子集数. s≤60,n≤10s \leq 60,n \leq 10s≤60,n≤10 ...

  5. 【HDU - 5700】【51nod - 1672】 区间交(贪心,STLset 或线段树第k大)

    题干: 小A有一个含有n个非负整数的数列与m个区间,每个区间可以表示为li,ri. 它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大.(是指k个区间共同的交,即每个区间都包含这一段 ...

  6. 2017年ICPC西安邀请赛A、XOR(线段树套线性基 + 思维)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目传送门 Problem 给你 nnn 和 nnn 个整数的数组 aaa,以及kkk和qqq,有 q ...

  7. Codechef REBXOR HYSBZ - 4260(01字典树+区间异或最大)

    Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,-,AN. Output 输出一行包含给定表达式可能的最大值. Sample Input 5 1 2 ...

  8. xor(线性基的合并)

    题目链接:https://ac.nowcoder.com/acm/contest/884/B 链接:https://ac.nowcoder.com/acm/contest/884/B 来源:牛客网 时 ...

  9. splay + 线段树 ---- P3765总统选举 [带修改的动态区间众数 摩尔投票+n棵splay]

    题目链接 题目大意: 解题思路: 1.摩尔投票法: 题意是找n个数内出现次数大于n/2的数 保证存在这个数用的方法叫做摩尔投票法 首先我们注意到这样一个现象: 在任何数组中,出现次数大于该数组长度一半 ...

  10. java 区间树_线段树(区间树)之区间染色和4n推导过程

    前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...

最新文章

  1. ecshop的Mysql操作类
  2. Java程序设计第三次作业
  3. javafx性能_对JavaFX Mobile应用程序进行性能分析
  4. httpd Server not started: (13)Permission denied: make_sock: could not bind to address [::]:88
  5. Codevs 1043 方格取数
  6. WinForm中的一种死锁场景
  7. Spring Cloud Config分布式配置中心高可用及配置刷新(学习总结)
  8. 打造个人专属邮箱,域名邮箱,邮件系统
  9. rust服务器人数查询网站,Rust Web框架列表
  10. java大文件下载失败_java文件下载超过4G文件错误
  11. 图象处理基本算法[整理]
  12. 扫 雷 小 游 戏
  13. 趋势与新高的实战研究
  14. SAP案例教程FI财务后台配置
  15. 【Python实战】听书就用它了:海量资源随便听,内含几w书源,绝对精品哦~(好消息好消息)
  16. HTML5期末大作业:个人介绍/个人主页/网页设计——个人博客 (11页) HTML+CSS+JavaScript
  17. 冯.诺依曼体系结构对计算机发展的限制
  18. linux ftp web服务器搭建,Linux系统下搭建Web服务器和FTP服务器
  19. Neo4j desktop安装APOC扩展包
  20. matlab里的pid参数调节,PID控制参数整定(调节方法)原理+图示+MATLAB调试

热门文章

  1. 按钮按一下画个直线_直线导轨数控车床概念和作用
  2. JDK8之后,新增的时间类对象
  3. Java自学学习路线,自学方法,0基础小白如何怎么样才能用最短的时间学好Java
  4. python导入datetime模块_Python时间模块datetime用法
  5. ila数据导入matlab,MATLAB读取Xilinx ILA核保存的.ila文件中的两列数据,并输出到文件保存...
  6. 多显示器 坐标 左上角_也许是你的第一台专业显示器,隶属华硕ProArt创意国度的PA248QV...
  7. C# 在服务器生成文件/文件夹并压缩下载到本地
  8. 跨域将.net 工程嵌入别的系统页面中发生的js、ajax的拒绝访问的错误
  9. VS2005发布网站问题及aspnet_merge.exe”已退出,代码为 1的错误以及所有代码文件生成一个dll
  10. [bzoj 1861][zjoi2006] 书架