XOR 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,将这些数放入线性基中。
由于每次都是区间查询,我们就可以利用线段树的思想,建立一棵结点为线性基的线段树,
每次区间查询的时候就查询出这几个区间合并后的线性基,再用线性基的性质查询最大值即可。
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define maxn 12345
- ll t,n,k,q,l,r,a[maxn],ans;
- struct node
- {
- ll p[66];
- void init()
- {
- memset(p,0,sizeof(p));
- }
- node()
- {
- memset(p,0,sizeof(p));
- }
- void add(ll x)
- {
- for(int i=60; i>=0; i--)
- {
- if(!(x&(1<<i)))continue;
- if(!p[i])
- {
- p[i]=x;
- break;
- }
- else x^=p[i];
- }
- }
- node operator+(const node &b)const
- {
- node ret=b;
- for(int i=60; i>=0; i--)
- if(p[i])ret.add(p[i]);
- return ret;
- }
- ll rp()
- {
- ll re=0;
- for(int i=60; i>=0; i--)
- if((re^p[i])>re)re^=p[i];
- return re;
- }
- } tree[maxn*4];
- void up(int root)
- {
- tree[root]=tree[root*2]+tree[root*2+1];
- }
- void bulid(int root,int l,int r)
- {
- tree[root].init();
- if(l==r)
- {
- tree[root].add(a[l]);
- return ;
- }
- int mid=(l+r)/2;
- bulid(root*2,l,mid);
- bulid(root*2+1,mid+1,r);
- up(root);
- }
- node query(int root,int l,int r,int L,int R)
- {
- if(L<=l&&r<=R)
- return tree[root];
- int mid=(l+r)/2;
- if(L>mid)return query(root*2+1,mid+1,r,L,R);
- else if(R<=mid)return query(root*2,l,mid,L,R);
- else return query(root*2,l,mid,L,R)+query(root*2+1,mid+1,r,L,R);
- }
- int main()
- {
- scanf("%lld",&t);
- while(t--)
- {
- scanf("%lld%lld%lld",&n,&q,&k);
- k=~k;
- for(int i=1; i<=n; i++)
- {
- scanf("%lld",&a[i]);
- a[i]=(a[i]&k);
- }
- k=~k;
- bulid(1,1,n);
- while(q--)
- {
- ans=k;
- scanf("%lld%lld",&l,&r);
- node tp=query(1,1,n,l,r);
- ans=(ans|tp.rp());
- printf("%lld\n",ans);
- }
- }
- return 0;
- }
XOR UVALive - 8512 -区间线性基合并的更多相关文章
- 2017西安区域赛A / UVALive - 8512 线段树维护线性基合并
题意:给定\(a[1...n]\),\(Q\)次询问求\(A[L...R]\)的异或组合再或上\(K\)的最大值 本题是2017的西安区域赛A题,了解线性基之后你会发现这根本就是套路题.. 只要用线段 ...
- 【BZOJ-4568】幸运数字 树链剖分 + 线性基合并
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 238 Solved: 113[Submit][Status ...
- CodeForces 587 E.Duff as a Queen 线段树动态维护区间线性基
https://codeforces.com/contest/587/problem/E 一个序列, 1区间异或操作 2查询区间子集异或种类数 题解 解题思路大同小异,都是利用异或的性质进行转化,st ...
- 2017 ACM-ICPC Asia Xi'an Problem A XOR(异或线性基 )
题目链接 2017西安赛区 Problem A 题意 给定一个数列,和$q$个询问,每个询问中我们可以在区间$[L, R]$中选出一些数. 假设我们选出来的这个数列为$A[i_{1}]$, $A[ ...
- 【BZOJ-4269】再见Xor 高斯消元 + 线性基
4269: 再见Xor Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 131 Solved: 81[Submit][Status][Discuss] ...
- BZOJ 4269: 再见Xor [高斯消元 线性基]
4269: 再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 我太愚蠢了连数组开小了以及$2^{ ...
- 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】
[bzoj数据下载地址]不要谢我 先讲一下窝是怎么错的... \(MLE\)是因为数组开小了.. 看到异或和最大,那么就会想到用线性基. 如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记a ...
- Codeforces1101G (Zero XOR Subset)-less 【线性基】【贪心】
题目分析: 考虑到这是一个区间的异或问题,不妨求出前缀和,令$sum[i] = Xor_{j=1}^{i}a[j]$. 对于区间$[l,r]$的异或结果,等于$sum[r] \oplus sum[l- ...
- 【线性基合并 树链剖分】bzoj4568: [Scoi2016]幸运数字
板子题 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市 ...
随机推荐
- [ZJOI2019]麻将(动态规划,自动机)
[ZJOI2019]麻将(动态规划,自动机) 题面 洛谷 题解 先做一点小铺垫,对于一堆牌而言,我们只需要知道这\(n\)张牌分别出现的次数就行了,即我们只需要知道一个长度为\(n\)的串就可以了. ...
- Java【第二篇】基本语法之--进制、运算符
进制 对于整数,有四种表示方式: 二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头. 十进制:0-9 ,满 10 进 1. 八进制:0-7 ,满 8 进1. 以数字 0 开头表示. 十六进制 ...
- hdu5238 calculator (线段树+crt)
(并不能)发现29393不是质数,而是等于7*13*17*19 于是可以用四个线段树分别维护模意义下,对x进行一个区间的操作后的值 最后再把这四个的答案用crt拼起来 也可以不crt,而是预处理0~2 ...
- kibana连接elasticsearch集群做负载均衡
问题背景: 在ELK架构中,kibana一般配置连接elasticsearch的时候,配置文件中的写法一般如下: ……# The URL of the Elasticsearch instance t ...
- 第一次连接数据库mongodb踩的坑
类型匹配错误,参数要写对了,name与age一一对应. 如果没找到错误就把异常打印出来. await person.save(function(err) { if(err) console.log(e ...
- 携程apollo系列-个人开发环境搭建
本博客讲详细讲解如何在 Windows 搭建携程 Apollo 服务器 (用户个人开发). 开发服务器有多种搭建方式:(1) docker, 搭建过程非常简单, 推荐有 docker 环境(2) 部署 ...
- 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 ...
- v-charts 和 websocket实现数据展示动态推送
v-charts https://v-charts.js.org/#/ ELEMENT力作: 在使用 echarts 生成图表时,经常需要做繁琐的数据类型转化.修改复杂的配置项,v-charts 的出 ...
- 设计模式九: 观察者模式(Observer Pattern)
简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...
- 剑指Offer编程题2——替换空格
剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...