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 ;
}

cf1100F - Ivan and Burgers

给定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); } }

最新文章

  1. 领域设计之模型充血、Repository对象注入
  2. CSS“反转”为LESS
  3. 发现一个不错的十六进制编辑器-HxD
  4. C#常量字段
  5. C# 模拟键盘按键操作
  6. 使用react-native做一个简单的应用-03欢迎界面
  7. 使用visual c++ 2005编译64位可执行文件
  8. jquery和vue对比
  9. Nand Flash基础知识与坏块管理机制的研究
  10. 【框架学习与探究之定时器--Hangfire】
  11. JAVANIO通道
  12. Jupyter Notebook
  13. ulimit -c unlimited的使用(转载)
  14. Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现
  15. Asp.net MVC 控制器ActionResult的例子
  16. PHP代码审计笔记--任意文件下载漏洞
  17. mysql 安装版
  18. VUE 监听局部滚动 设置ICON的位置跟随
  19. .net 数据脱敏代码实现
  20. hadoop分类输出

热门文章

  1. Python笔记(二十四)_魔法方法_运算符的魔法方法
  2. web service接口 wsdl和asmx有什么区别
  3. B.Petr and a Combination Lock
  4. 灵活的理解JavaScript中的this指向(一)
  5. Vue-cli2项目文件目录解析
  6. bootstrap复习
  7. ant-design如果按需加载组件
  8. Python在线IDE | 谷歌Colaboratory云端IDE介绍
  9. 12 | 为什么我的MySQL会“抖”一下? 学习记录
  10. [CF] 8C Looking for Order