标签:XOR int xian pos base 线性 return id
题意:最大化 Z=K or (A[i1] xor A[i2] … xor A[it]) ( L<=i <= R ) ,区间查询
思路:注意到,我们可以忽略线性基中 对应 k 的位置为1 的位,所以我们一开始将a数组中的每个数 & ~k
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int base = 30;
const int maxn = 10005;
template <typename T>
struct node
{
T a[base+1]; //线性基的插入结果
int pos[base+1];
void init(){
memset( a,0,sizeof(a) );
memset( pos,0,sizeof(pos) );
}
bool ins(T b,int _pos) // 向线性基中插入一个数
{
for(int i=base;i>=0;i--)
if(b>>i){
int tmp = a[i];
if(!a[i])
{
a[i]=b;pos[i] = _pos;
return true ;
}else{
if( pos[i] < _pos ){
tmp = a[i];
a[i] = b;
swap( pos[i],_pos );
}
}
b^=tmp;
}
return false ;
}
bool check (T b) // 如果可以表示出来,返回true ,否则返回 false
{
for(int i=base;i>=0;i--)
{
if(b>>i)
{
if(!a[i])return false ;
b^=a[i];
}
}
return true ;
}
T solve( int l ){ //在线线性基区间查询操作,左端点为l
int res = 0;
for( int i = base;i >= 0;i-- ){
if( a[i] && pos[i] >= l && !(res >> i & 1) ){
res ^= a[i];
}
}
return res;
}
};
node<int>t[10005];
int a[maxn];
void append( int id,int v ){
t[id] = t[id-1];
t[id].ins( v,id );
}
int main(){
int T;
scanf("%d",&T);
while(T--){
t[0].init();
int n,q,k;
scanf("%d%d%d",&n,&q,&k);k = ~k;
for( int i = 1;i <= n;i++ ) {
scanf("%d",&a[i]);a[i] &=k;
append( i,a[i]);
}
k = ~k;
for( int l,r,i = 1;i <= q;i++ ){
scanf("%d%d",&l,&r);
int ans = t[r].solve(l);
printf("%d\n",ans|k );
}
}
return 0;
}
标签:XOR,int,xian,pos,base,线性,return,id 来源: https://blog.csdn.net/ehdhg13455/article/details/100664428
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。