区间查询异或最大值——cf1100F,hdu6579(线性基)
2024-10-07 13:07:50
hdu6579
题意
初始时有n个数,现在有q次操作:
查询[l,r]内选择一些数使得异或和最大;
在末尾加入一个数。
题目强制在线。
思路
对于i我们记录[1,i]每个基底最靠近i的位置和这个位置的值,然后查询时看r 这个位置记录的每个基底的位置是否大于等于l,如果大于等于那么[l,r] 内一定有一个位置可以贡献这个基底,然后比较答案大小即可。
题目对数据加密了:
x^=lastans; ///题目的要求
l=(l^lastans)%n+1; ///题目的要求
r=(r^lastans)%n+1; ///题目的要求
#include<bits/stdc++.h>
using namespace std;
const int maxn = + ;
int t, n, q, op, l, r, x;
int a[maxn], b[], pos[], base[maxn][], las[maxn][]; bool add(int val, int pp) {
for (int i = ; i >= ; i--) {
if (val & (1ll << i)) {
if (!b[i]) {
pos[i] = pp;
b[i] = val;
break;
}
if(pos[i] < pp) {
swap(b[i], val);
swap(pos[i], pp);
}
val ^= b[i];
}
}
return val > ;
}
int main() { scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &q);
for(int i = ; i >= ; --i) b[i] = , pos[i] = ;
for(int i = ; i <= n; ++i) {
scanf("%d", &a[i]);
add(a[i], i);
for(int j = ; j >= ; --j) base[i][j] = b[j], las[i][j] = pos[j];
}
int lastans = ;
while(q--) {
scanf("%d", &op);
if(op) {
++n;
scanf("%d", &x);
x ^= lastans;///题目的要求
add(x, n);
for(int i = ; i >= ; --i) base[n][i] = b[i], las[n][i] = pos[i];
} else {
scanf("%d%d", &l, &r);
l = (l ^ lastans) % n + , r = (r ^ lastans) % n + ;///题目的要求
if(l > r) swap(l, r);
lastans = ;
for(int i = ; i >= ; --i) {
if(las[r][i] >= l && (lastans ^ base[r][i]) > lastans) {
lastans ^= base[r][i];
}
}
printf("%d\n", lastans);
}
}
}
return ;
}
给定n和a[]
有q个询问:
给定l,r
求在a[]al…r中选取任意个,使得他们的异或和最大。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn =1e6+;
int b[],pos[],a[maxn],base[maxn][],las[maxn][];
bool add(int val , int pp){
for(int i= ; i>= ; i--){
if(val & (<<i)){
if (!b[i]) {
pos[i] = pp;
b[i] = val;
break;
}
if(pos[i] < pp) {
swap(b[i], val);
swap(pos[i], pp);
}
val^=b[i];
}
}
return val>;
}
int main(){ int n,q;
scanf("%d",&n);
for(int i= ; i>= ; i--) b[i]=,pos[i]=;
for(int i= ; i<=n ; i++){
scanf("%d",&a[i]);
add(a[i],i);
for(int j= ; j>= ; j--) base[i][j]=b[j],las[i][j]=pos[j];
}
int lastans=;
scanf("%d",&q);
while(q--){
int op,x,l,r;
scanf("%d%d",&l,&r);
lastans=;
for(int i= ; i>= ; i--){
if(las[r][i]>=l && (lastans^base[r][i])>lastans){
lastans^=base[r][i];
}
}
printf("%d\n",lastans); } }
最新文章
- 领域设计之模型充血、Repository对象注入
- CSS“反转”为LESS
- 发现一个不错的十六进制编辑器-HxD
- C#常量字段
- C# 模拟键盘按键操作
- 使用react-native做一个简单的应用-03欢迎界面
- 使用visual c++ 2005编译64位可执行文件
- jquery和vue对比
- Nand Flash基础知识与坏块管理机制的研究
- 【框架学习与探究之定时器--Hangfire】
- JAVANIO通道
- Jupyter Notebook
- ulimit -c unlimited的使用(转载)
- Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现
- Asp.net MVC 控制器ActionResult的例子
- PHP代码审计笔记--任意文件下载漏洞
- mysql 安装版
- VUE 监听局部滚动 设置ICON的位置跟随
- .net 数据脱敏代码实现
- hadoop分类输出
热门文章
- Python笔记(二十四)_魔法方法_运算符的魔法方法
- web service接口 wsdl和asmx有什么区别
- B.Petr and a Combination Lock
- 灵活的理解JavaScript中的this指向(一)
- Vue-cli2项目文件目录解析
- bootstrap复习
- ant-design如果按需加载组件
- Python在线IDE | 谷歌Colaboratory云端IDE介绍
- 12 | 为什么我的MySQL会“抖”一下? 学习记录
- [CF] 8C	Looking for Order