HDU6579 2019HDU多校训练赛第一场1002 (线性基)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579

题意:

两种操作

1.在序列末尾添加一个数

2.查询区间异或最大值

强制在线

题解:

暴力的做法可以用数据结构维护区间线性基,但肯定过不了。

贪心地维护序列的前缀线性基 (上三角形态),对于每个线性基,将出现位置靠右的数

字尽可能地放在高位,也就是说在插入新数字的时候,要同时记录对应位置上数字的出现位

置,并且在找到可以插入的位置的时候,如果新数字比位置上原来的数字更靠右,就将该位

置上原来的数字向低位推。

在求最大值的时候,从高位向低位遍历,如果该位上的数字出现在询问中区间左端点的

右侧且可以使答案变大,就异或到答案里。

对于线性基的每一位,与它异或过的线性基更高位置上的数字肯定都出现在它右侧 (否

则它就会被插入在那个位置了),因此做法的正确性显然。

代码:

#include <set>
#include <map>
#include <cmath>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define bug printf("*********\n")
#define FIN freopen("input.txt","r",stdin);
#define FON freopen("output.txt","w+",stdout);
#define IO ios::sync_with_stdio(false),cin.tie(0)
#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"
#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"
#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<<z<<"]\n"
const int maxn = 1e6 + 5;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
LL quick_pow(LL x, LL y) {
LL ans = 1;
while(y) {
if(y & 1) {
ans = ans * x % mod;
} x = x * x % mod;
y >>= 1;
} return ans;
}
int f[maxn][32];
int pos[maxn][32];
void add(int x, int i) {
int k = i;
int tmp;
for (int j = 30; j >= 0; --j) f[i][j] = f[i - 1][j], pos[i][j] = pos[i - 1][j];
for (int j = 30; j >= 0; --j) if (x >> j) {
if (!f[i][j]) {
f[i][j] = x;
pos[i][j] = k;
break;
} else {
if (k > pos[i][j]) {
tmp = k, k = pos[i][j], pos[i][j] = tmp;
tmp = x, x = f[i][j], f[i][j] = tmp;
}
x ^= f[i][j];
}
} }
int main() {
#ifndef ONLINE_JUDGE
FIN
#endif
int T;
scanf("%d", &T);
while(T--) {
memset(pos, 0, sizeof(pos));
memset(f, 0, sizeof(f));
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1, x; i <= n; i++) {
scanf("%d", &x);
add(x, i);
}
int lastans = 0;
while(m--) {
int op;
int l, r, x;
scanf("%d", &op);
if(op == 0) {
scanf("%d%d", &l, &r);
// debug2(l, r);
l = (l ^ lastans) % n + 1;
r = (r ^ lastans) % n + 1;
if(l > r) swap(l, r);
int ans = 0;
for(int j = 30; j >= 0; --j) {
if((ans ^ f[r][j]) > ans && pos[r][j] >= l) {
ans ^= f[r][j];
}
}
printf("%d\n", ans);
lastans = ans;
} else {
scanf("%d", &x);
x^=lastans;
n++;
add(x, n);
}
}
}
return 0;
}

HDU6579 2019HDU多校训练赛第一场1002 (线性基)的更多相关文章

  1. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  2. HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可 ...

  3. Contest1585 - 2018-2019赛季多校联合新生训练赛第一场(部分题解)

    Contest1585 - 2018-2019赛季多校联合新生训练赛第一场 C 10187 查找特定的合数 D 10188 传话游戏 H 10192 扫雷游戏 C 传送门 题干: 题目描述 自然数中除 ...

  4. 10.29训练赛第一场B题

    题目大意:有n个队伍之间比赛,每两个队伍之间都有一场比赛,因此一共有n(n-1) / 2场比赛,但是这里丢失了一场比赛的记录,现在让你通过n(n-1) /2 -1场仍然存在的比赛记录来判断丢失的那条比 ...

  5. 2015 多校赛 第一场 1002 (hdu 5289)

    Description Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n ...

  6. 2019HDU多校训练第三场 Planting Trees 暴力 + 单调队列优化

    题意:有一个n * n的网格,每个网格中间有一颗树,你知道每棵树的高,你可以选择一个矩形区域把里面的树都围起来,但是矩形区域里面任意两棵树的高度差的绝对值不超过m,问这个矩形的最大面积是多少? 思路: ...

  7. 训练赛第一场D题

    解题报告:一开始不知道ATA的意思,后来才知道原来是转置矩阵乘以原来的矩阵.这题说起来比较麻烦就不说了,直接上代码: #include<cstdio> #include<cstrin ...

  8. 训练赛第一场A题 (ZOJ 2313)

    解题报告:n个人围坐成一圈,并且将这n个人从1到n编号,然后编号为1 的人手上有一个物品,将这个物品往向左传递给第k个人,1<=k<=n/2,当这个物品再次传到编号为1 的人的手上时,游戏 ...

  9. Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)

    Contest1592 - 2018-2019赛季多校联合新生训练赛第二场 D 10248 修建高楼(模拟优化) H 10252 组装玩具(贪心+二分) D 传送门 题干 题目描述 C 市有一条东西走 ...

随机推荐

  1. hdu1421 dp

    用dp[i][j]表示放了i件物品,j对时的最小值. dp[i-2][j-1]表示取当前的 dp[i-1][j]表示不取当前的. #include<stdio.h> #include< ...

  2. @RequestBody对象为空,异常Required request body is missing错误解决

    1.异常 org.springframework.http.converter.HttpMessageNotReadableException: Required request body is mi ...

  3. 反射技术的入口 获取类的Class信息

    package com.sxt.reflect; import com.sxt.reflect.entity.Student; /* * 获取类的Class信息 */ public class Tes ...

  4. 2019-8-31-C#-通过-probing-指定-dll-寻找文件夹

    title author date CreateTime categories C# 通过 probing 指定 dll 寻找文件夹 lindexi 2019-08-31 16:55:58 +0800 ...

  5. MaxCompute客户端(odpscmd)在windows命令行下查询中文乱码问题处理实践

    MaxCompute客户端工具是阿里云大数据计算服务MaxCompue产品官方客户端工具,通过客户端工具可以连接MaxCompute项目,完成包括数据管理.数据上下传.作业执行.用户及授权管理等各项操 ...

  6. 设置PHP最长运行时间

    通常来说,默认的PHP程序最大运行时间是30s,如果你的程序运行超过这个时间限制,那么会有类似Maximum execution time of 30 seconds exceeded的报错. 有几种 ...

  7. 【NS2】WiMAX_NS2说明文档(转载)

    关于目前NS2中WiMAX模块的说明 (1)美国NIST(National Institute of Standards and Technology)版, 可以从NIST主页获得,2007.04 r ...

  8. Spring读取mybatis在多个jar包下的的mapper文件

     刚开始的时候我的配置文件在同名目录下都是在/mapper下,导致只能读取一个jar中的mapper文件.先解决如下: 1.将mapper文件放在不能放在同名的目录下.        比如:user. ...

  9. DOTA轮播

    原文:DOTA轮播 本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看. 这一节介绍一下Dota轮播,先看看最终效果图. 一.HTML代码分析: &l ...

  10. Calendar类实现当前日期的日历

    package com.sxt.home1; import java.text.DateFormat; import java.text.ParseException; import java.tex ...