【bzoj4184】shallot 线段树+高斯消元动态维护线性基
题目描述
小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏。
输入
第一行一个正整数n表示总时间;第二行n个整数a1,a2...an,若ai大于0代表给了小葱一颗数字为ai的小葱苗,否则代表从小葱手中拿走一颗数字为-ai的小葱苗。
输出
输出共n行,每行一个整数代表第i个时刻的最大异或和。
样例输入
6
1 2 3 4 -2 -3
样例输出
1
3
3
7
7
5
题解
线段树+高斯消元动态维护线性基
由于线性基不支持删除操作,所以我们需要离线来处理。
我们注意到每个数出现的时间都是一段连续的区间,所以可以使用map维护每个数的开始时间和结束时间,并在这一段区间上插入这个数。
我们肯定不能暴力在每个时间点上插入,所以需要线段树来降低时间复杂度。
在线段树的每个节点上开一个vector,存储这个区间的线性基。对于每个操作,在对应的vector上使用高斯消元动态维护线性基。
查询时,可以遍历整棵线段树,对于叶子结点直接使用贪心的方法查询并输出。但是如果将父亲节点的线性基暴力插入到儿子节点的话会导致MLE,于是需要记录一个新的节点,每次相当于将该节点的线性基插入到这个新的节点中。具体见代码。
时间复杂度$O(n\log^2n)$
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#define N 500010
using namespace std;
struct data
{
vector<int> v;
void insert(int x)
{
int i;
for(i = 0 ; i < v.size() ; i ++ )
if((x ^ v[i]) < x)
x ^= v[i];
if(x)
{
v.push_back(x);
for(i = v.size() - 1 ; i ; i -- )
{
if(v[i] > v[i - 1]) swap(v[i] , v[i - 1]);
else break;
}
}
}
int calc()
{
int i , ans = 0;
for(i = 0 ; i < v.size() ; i ++ )
if((ans ^ v[i]) > ans)
ans ^= v[i];
return ans;
}
}S[N << 2] , emp;
map<int , int> f;
int a[N];
void update(int b , int e , int a , int l , int r , int x)
{
if(b <= l && r <= e)
{
S[x].insert(a);
return;
}
int mid = (l + r) >> 1;
if(b <= mid) update(b , e , a , l , mid , x << 1);
if(e > mid) update(b , e , a , mid + 1 , r , x << 1 | 1);
}
void query(int l , int r , int x , data t)
{
int i , mid = (l + r) >> 1;
for(i = 0 ; i < S[x].v.size() ; i ++ ) t.insert(S[x].v[i]);
if(l == r)
{
printf("%d\n" , t.calc());
return;
}
query(l , mid , x << 1 , t) , query(mid + 1 , r , x << 1 | 1 , t);
}
int main()
{
int n , i , x;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%d" , &a[i]);
if(a[i] > 0) f[a[i]] = i;
else update(f[-a[i]] , i - 1 , -a[i] , 1 , n , 1) , f[-a[i]] = 0;
}
for(i = 1 ; i <= n ; i ++ )
if(a[i] > 0 && f[a[i]])
update(f[a[i]] , n , a[i] , 1 , n , 1);
query(1 , n , 1 , emp);
return 0;
}
【bzoj4184】shallot 线段树+高斯消元动态维护线性基的更多相关文章
- 【bzoj4568】[Scoi2016]幸运数字 树上倍增+高斯消元动态维护线性基
题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游 ...
- HDU3949:XOR(高斯消元)(线性基)
传送门 题意 给出n个数,任意个数任意数异或构成一个集合,询问第k大个数 分析 这题需要用到线性基,下面是一些资料 1.高斯消元&线性基&Matirx_Tree定理 笔记 2.关于线性 ...
- bzoj2115 [Wc2011] Xor——高斯消元 & 异或线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 异或两次同一段路径的权值,就相当于没有走这段路径: 由此可以得到启发,对于不同的走法, ...
- BZOJ 4184 线段树+高斯消元
思路: 线段树表示的是时间 每回最多log个段 区间覆盖 一直到叶子 的线性基 xor 一下 就是答案 一开始没有思路 看了这篇题解 豁然开朗 http://www.cnblogs.com/joyou ...
- BZOJ 4004: [JLOI2015]装备购买 [高斯消元同余 线性基]
和前两(一)题一样,不过不是异或方程组了..... 然后bzoj的新数据是用来卡精度的吧..... 所有只好在模意义下做啦 只是巨慢无比 #include <iostream> #incl ...
- 【bzoj2115】[Wc2011] Xor DFS树+高斯消元求线性基
题目描述 输入 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图 ...
- 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心
3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 839 Solved: 490[Submit][Stat ...
- BZOJ 2466: [中山市选2009]树( 高斯消元 )
高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...
- 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组
[题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...
随机推荐
- 洛谷 P1588 丢失的牛
题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接走到2*x的位置.计算他 ...
- Codevs 1860 最大数
题目描述 Description 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 输入描述 Input Description 第一行一个正整数n. 第二行n个正整数,空格隔开 ...
- codeforce Gym 100500E IBM Chill Zone (SG函数)
关于sg函数这篇blog讲得很详细http://blog.csdn.net/logic_nut/article/details/4711489. sg函数的价值在于把复杂的游戏拆分成简单的游戏,然后通 ...
- Tarjan的学习笔记 求割边求割点
博主图论比较弱,搜了模版也不会用... 所以决心学习下tarjan算法. 割点和割边的概念不在赘述,tarjan能在线性时间复杂度内求出割边. 重要的概念:时间戟,就是一个全局变量clock记录访问结 ...
- 3. Netbackup 7.6客户端的安装(windows/linux)
1 客户端的安装 1.1 Windows客户端安装 1.1.1 客户端hosts修改 windows xp/2003/vista/2008/7/8用户HOSTS文件是在“c:\windows\syst ...
- HTML之基本语法(表单)
一.表单的基本介绍 表单:就是互联网上用于收集用户信息的一种结构,在HTML当中事先定义好了一种标签来完成此事,标签名称为form,它是一个双标签<form action="" ...
- 生成gt数据出问题
使用cout打印uchar类型数据时,打印出来是其相应的ascii码
- 【转】Java8学习笔记(1) -- 从函数式接口说起
http://blog.csdn.net/zxhoo/article/details/38349011 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Jav ...
- Bootstrap历练实例:堆叠的进度条
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 【转】Matlab的regionprops详解
matlab函数_连通区域 1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下 ...