题目传送门

题意:

  给出 n 个数,q次区间查询,每次查询,让你选择任意个下标为 [ l , r ] 区间内的任意数,使这些数异或起来最大,输出最大值。

思路:离线加线性基。

线性基学习博客1

线性基学习博客2

对于此题,先把区间按照 r 从小到大排序,然后依次处理这些区间,每次插入线性基时,优先保留下标比较大的线性基。查询时,只异或上下标大于 l 的值。

记住异或的符号的优先级很低,所以  if( res^p[i] > res )这样的代码是会wa死的,要注意(这道题这么写,样例都过不了)

#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=5e5+;
int a[maxn],q,n,p[],pos[],ans[maxn];
struct node{
int l,r,id;
friend bool operator<(const node &a,const node &b)
{
return a.r<b.r;
}
}op[maxn];
void init(){
clr(p,);
}
void add(int val,int id){
for(int i=;i>=;i--)
{
if(val&(<<i))
{
if(!p[i]){
p[i]=val,pos[i]=id;
break;
}
if(pos[i]<id){
swap(pos[i],id),swap(val,p[i]);
}
val^=p[i];
}
}
}
int query(int l)
{
int res=;
for(int i=;i>=;i--)
{
if(pos[i]>=l)
{
if((res^p[i])>res)
{
res=res^p[i];
}
}
}
return res;
}
int main(){
while(cin>>n)
{
init();
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
cin>>q;
for(int i=;i<=q;i++)
{
scanf("%d%d",&op[i].l,&op[i].r);
op[i].id=i;
}
sort(op+,op++q);
int l=;
for(int i=;i<=q;i++)
{
while(l<=op[i].r&&l<=n)
{
add(a[l],l);
l++;
}
ans[op[i].id]=query(op[i].l);
}
for(int i=;i<=q;i++)
{
printf("%d\n",ans[i]);
}
}
}

最新文章

  1. angular之上滑换页指令
  2. 我的微型工作流引擎-功能解析及API设计
  3. Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
  4. ServiceStack.Redis 中关系操作的局限与bug
  5. Delphi Val函数
  6. WebStorm2016.1 破解 激活
  7. WebService基于SoapHeader实现安全认证(一)
  8. CentOS 搭建 FastDFS-5.0.5集群
  9. FineUI按钮控件
  10. qt坐标系统
  11. COMException 依赖服务或组无法启动(0x8007042C)处理办法
  12. sqlcmd的使用小结
  13. iKcamp出品微信小程序教学共5章16小节汇总(含视频)
  14. Mac--Homebrew简介及安装
  15. TCP报文解析
  16. SSM框架:解决后台传数据到前台中文乱码问题,使用@ResponseBody返回json 中文乱码
  17. java进阶学习的一些思路
  18. sql数据库光标变成黑快怎么回事?
  19. 行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)
  20. Vue 父组件循环使用refs调用子组件方法出现undefined的问题

热门文章

  1. Base -快捷键|通配符|特殊符号|输出(正确与错误的保存)
  2. 9-python 的ProxyHandler处理器(代理设置)
  3. PCL 常用小知识
  4. Luogu 3265 [JLOI2015]装备购买
  5. inux内核的编译与安装 (转)
  6. 智能IC卡中的文件系统
  7. 2.3.2 volatile 说明
  8. [GO]数组做函数参数
  9. easyui 列表 条件检索
  10. (转)关于Update语句的锁