前言:虽然已经有很多题解了,但是还是想按自己的理解写一篇。

思路:首先分析题目

   一、区间操作 —— 线段树

   二、异或操作 —— 线性基

   这个两个不难想,关键是下一步的技巧

    “或”运算 就是两个数的二进制中,对应位 只要有1,那么就是该位结果就是 1,所以要想k“或”运算后的结果尽量大,

   就需要异或出的数,各个位上的1尽量多。

   线性基的操作,可以求出区间最大异或和,但是我们需要的结果是  “或”运算。

   所以我们可以将 k 取反,然后把所有数在加入线性基之前,全部 “与”运算一遍,再加入线性基。

   这样,线性基中的每一位,全部都是能使得k变大的数了,因为k的二进制上的每一位 1 的位置,线性基中都是0。

   所以,我们只需要求, k 异或 线性基中最大异或和 。

  

//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#pragma GCC optimize(2)
#include <bits/stdc++.h>
#include<unordered_set> using namespace std;
typedef double dou;
typedef long long ll;
typedef pair<int, int> pii;
typedef map<int, int> mii; #define pai acos(-1.0)
#define M 10050
#define inf 0x3f3f3f3f
#define mod 1000000007
#define IN inline
#define W(a) while(a)
#define lowbit(a) a&(-a)
#define left k<<1
#define right k<<1|1
#define lson L, mid, left
#define rson mid + 1, R, right
#define ms(a,b) memset(a,b,sizeof(a))
#define Abs(a) (a ^ (a >> 31)) - (a >> 31)
#define random(a,b) (rand()%(b+1-a)+a)
#define false_stdio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) int T;
int n, q, k;
int tmp, x, y, z; struct Data {
int num[];
void insert(int t) {
for (int i = ; i >= ; i--) {
if (t >> i & ) {
if (!num[i]) { num[i] = t; break; }
t ^= num[i];
}
}
}
}tree[M << ], ans; IN void Updata(int L, int R, int k,int pos) {
tree[k].insert(tmp);
if (L == R)return;
int mid = L + R >> ;
if (pos <= mid)Updata(lson, pos);
else Updata(rson, pos);
} IN void Query(int L, int R, int k) {
if(x<=L && R<=y){
for (int i = ; i >= ; i--) {
if (tree[k].num[i])ans.insert(tree[k].num[i]);
}
return;
}
int mid = L + R >> ;
if (x <= mid)Query(lson);
if (y > mid)Query(rson);
} IN int read() {//快读
int v = , f = ; char ch = getchar();
W(!isdigit(ch)) { f |= ch == '-'; ch = getchar(); }
W(isdigit(ch)) { v = (v << ) + (v << ) + (ch ^ ); ch = getchar(); }
return f ? -v : v;
} int main() {
T = read();
W(T--) {
n = read(), q = read(), k = read();
for (int i = ; i <= n; i++) {
tmp = read();
tmp &= (~k);//关键的一步
Updata(, n, , i);
}
W(q--) {
ms(ans.num, );
x = read(), y = read();
Query(, n, );
z = k;
for (int i = ; i >= ; i--)z = max(z, z ^ ans.num[i]);
printf("%d\n", z);
}
}
return ;
}

   

   

最新文章

  1. thread_LockSupport
  2. bestcoder单调区间
  3. iOS 生成.a文件
  4. android四大组件学习总结以及各个组件示例(2)
  5. vue插件编写与实战
  6. Fiddler的script用法
  7. Flex读取txt文件中的内容(三)
  8. SQL语句中不同的连接JOIN
  9. Yii2的使用
  10. oracle pivot
  11. 字典排序 sorted
  12. BZOJ3211 花神游历各国 并查集 树状数组
  13. OpenStack入门之【OpenStack-havana】之单网卡-All In One 安装(基于CentOS6.4)
  14. nested exception is java.sql.SQLException: Incorrect string value: &#39;\xE7\x99\xBB\xE9\x99\x86...&#39; for column &#39;image&#39; at row 1
  15. +QFTPOPEN: 603,0 怎么把这样一个字符串中的 603 提取出来给一个 uint32_t 的变量那
  16. WatiN自动化测试
  17. 【bzoj4836】二元运算 分治FFT
  18. Ubuntu 安装mysql
  19. write.table函数语法:
  20. 新兵易学,老兵易用----C++(C++11的学习整理---如何减少代码量,加强代码的可读性)

热门文章

  1. loadBeanDefinitions方法源码跟踪(一)
  2. Android拷贝工程不覆盖原工程的配置方法
  3. 005、Java中使用文档注释
  4. 《新标准C++程序设计》4.6(C++学习笔记16)
  5. CSV用excel打开乱码
  6. SNOI2019 选做
  7. win2008R2 局域网共享
  8. Oracle--sqlplus--常用命令
  9. oracle 导出时报错EXP-00011:table不存在
  10. HDU - 6195 cable cable cable