UVALive - 8512

题意 :给出一个包含n个元素的数组A以及一个k,接下来进行q次询问,每次询问给出 l 和 r ,

要你求出从A[l] , A[l+1] , A[l + 2],...,A[r]中任选出若干个数异或起来的值val,使得 k | val 最大,输出这个最大值。

思路 :既然是要使得k | val得到的值最大,那么val必然是k这个数上二进制位为0的位置为1的数,同时1的位数要尽可能的多。

这样我们就可以先对k取反,求出k二进制位为0的位数变成1的数p,再用A[i]与上p,将这些数放入线性基中。

由于每次都是区间查询,我们就可以利用线段树的思想,建立一棵结点为线性基的线段树,

每次区间查询的时候就查询出这几个区间合并后的线性基,再用线性基的性质查询最大值即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define maxn 12345
  5. ll t,n,k,q,l,r,a[maxn],ans;
  6. struct node
  7. {
  8. ll p[66];
  9. void init()
  10. {
  11. memset(p,0,sizeof(p));
  12. }
  13. node()
  14. {
  15. memset(p,0,sizeof(p));
  16. }
  17. void add(ll x)
  18. {
  19. for(int i=60; i>=0; i--)
  20. {
  21. if(!(x&(1<<i)))continue;
  22. if(!p[i])
  23. {
  24. p[i]=x;
  25. break;
  26. }
  27. else x^=p[i];
  28. }
  29. }
  30. node operator+(const node &b)const
  31. {
  32. node ret=b;
  33. for(int i=60; i>=0; i--)
  34. if(p[i])ret.add(p[i]);
  35. return ret;
  36. }
  37. ll rp()
  38. {
  39. ll re=0;
  40. for(int i=60; i>=0; i--)
  41. if((re^p[i])>re)re^=p[i];
  42. return re;
  43. }
  44. } tree[maxn*4];
  45. void up(int root)
  46. {
  47. tree[root]=tree[root*2]+tree[root*2+1];
  48. }
  49. void bulid(int root,int l,int r)
  50. {
  51. tree[root].init();
  52. if(l==r)
  53. {
  54. tree[root].add(a[l]);
  55. return ;
  56. }
  57. int mid=(l+r)/2;
  58. bulid(root*2,l,mid);
  59. bulid(root*2+1,mid+1,r);
  60. up(root);
  61. }
  62. node query(int root,int l,int r,int L,int R)
  63. {
  64. if(L<=l&&r<=R)
  65. return tree[root];
  66. int mid=(l+r)/2;
  67. if(L>mid)return query(root*2+1,mid+1,r,L,R);
  68. else if(R<=mid)return query(root*2,l,mid,L,R);
  69. else return query(root*2,l,mid,L,R)+query(root*2+1,mid+1,r,L,R);
  70. }
  71. int main()
  72. {
  73. scanf("%lld",&t);
  74. while(t--)
  75. {
  76. scanf("%lld%lld%lld",&n,&q,&k);
  77. k=~k;
  78. for(int i=1; i<=n; i++)
  79. {
  80. scanf("%lld",&a[i]);
  81. a[i]=(a[i]&k);
  82. }
  83. k=~k;
  84. bulid(1,1,n);
  85. while(q--)
  86. {
  87. ans=k;
  88. scanf("%lld%lld",&l,&r);
  89. node tp=query(1,1,n,l,r);
  90. ans=(ans|tp.rp());
  91. printf("%lld\n",ans);
  92. }
  93. }
  94. return 0;
  95. }

  

XOR UVALive - 8512 -区间线性基合并的更多相关文章

  1. 2017西安区域赛A / UVALive - 8512 线段树维护线性基合并

    题意:给定\(a[1...n]\),\(Q\)次询问求\(A[L...R]\)的异或组合再或上\(K\)的最大值 本题是2017的西安区域赛A题,了解线性基之后你会发现这根本就是套路题.. 只要用线段 ...

  2. 【BZOJ-4568】幸运数字 树链剖分 + 线性基合并

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 238  Solved: 113[Submit][Status ...

  3. CodeForces 587 E.Duff as a Queen 线段树动态维护区间线性基

    https://codeforces.com/contest/587/problem/E 一个序列, 1区间异或操作 2查询区间子集异或种类数 题解 解题思路大同小异,都是利用异或的性质进行转化,st ...

  4. 2017 ACM-ICPC Asia Xi'an Problem A XOR(异或线性基 )

    题目链接  2017西安赛区 Problem A 题意  给定一个数列,和$q$个询问,每个询问中我们可以在区间$[L, R]$中选出一些数. 假设我们选出来的这个数列为$A[i_{1}]$, $A[ ...

  5. 【BZOJ-4269】再见Xor 高斯消元 + 线性基

    4269: 再见Xor Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 131  Solved: 81[Submit][Status][Discuss] ...

  6. BZOJ 4269: 再见Xor [高斯消元 线性基]

    4269: 再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 我太愚蠢了连数组开小了以及$2^{ ...

  7. 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】

    [bzoj数据下载地址]不要谢我 先讲一下窝是怎么错的... \(MLE\)是因为数组开小了.. 看到异或和最大,那么就会想到用线性基. 如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记a ...

  8. Codeforces1101G (Zero XOR Subset)-less 【线性基】【贪心】

    题目分析: 考虑到这是一个区间的异或问题,不妨求出前缀和,令$sum[i] = Xor_{j=1}^{i}a[j]$. 对于区间$[l,r]$的异或结果,等于$sum[r] \oplus sum[l- ...

  9. 【线性基合并 树链剖分】bzoj4568: [Scoi2016]幸运数字

    板子题 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市 ...

随机推荐

  1. [ZJOI2019]麻将(动态规划,自动机)

    [ZJOI2019]麻将(动态规划,自动机) 题面 洛谷 题解 先做一点小铺垫,对于一堆牌而言,我们只需要知道这\(n\)张牌分别出现的次数就行了,即我们只需要知道一个长度为\(n\)的串就可以了. ...

  2. Java【第二篇】基本语法之--进制、运算符

    进制 对于整数,有四种表示方式: 二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头. 十进制:0-9 ,满 10 进 1. 八进制:0-7 ,满 8 进1. 以数字 0 开头表示. 十六进制 ...

  3. hdu5238 calculator (线段树+crt)

    (并不能)发现29393不是质数,而是等于7*13*17*19 于是可以用四个线段树分别维护模意义下,对x进行一个区间的操作后的值 最后再把这四个的答案用crt拼起来 也可以不crt,而是预处理0~2 ...

  4. kibana连接elasticsearch集群做负载均衡

    问题背景: 在ELK架构中,kibana一般配置连接elasticsearch的时候,配置文件中的写法一般如下: ……# The URL of the Elasticsearch instance t ...

  5. 第一次连接数据库mongodb踩的坑

    类型匹配错误,参数要写对了,name与age一一对应. 如果没找到错误就把异常打印出来. await person.save(function(err) { if(err) console.log(e ...

  6. 携程apollo系列-个人开发环境搭建

    本博客讲详细讲解如何在 Windows 搭建携程 Apollo 服务器 (用户个人开发). 开发服务器有多种搭建方式:(1) docker, 搭建过程非常简单, 推荐有 docker 环境(2) 部署 ...

  7. Geometric regularity criterion for NSE: the cross product of velocity and vorticity 3: $u\times \f{\om}{|\om|}\cdot \f{\vLm^\be u}{|\vLm^\be u|}$

    在 [Chae, Dongho; Lee, Jihoon. On the geometric regularity conditions for the 3D Navier-Stokes equati ...

  8. v-charts 和 websocket实现数据展示动态推送

    v-charts https://v-charts.js.org/#/ ELEMENT力作: 在使用 echarts 生成图表时,经常需要做繁琐的数据类型转化.修改复杂的配置项,v-charts 的出 ...

  9. 设计模式九: 观察者模式(Observer Pattern)

    简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...

  10. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...