题目描述

小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏。

每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且
让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大。
这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为Oi选手的你,你能帮帮他吗?
你只需要输出最大的异或和即可,若小葱手中没有小葱苗则输出0。

输入

第一行一个正整数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 线段树+高斯消元动态维护线性基的更多相关文章

  1. 【bzoj4568】[Scoi2016]幸运数字 树上倍增+高斯消元动态维护线性基

    题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游 ...

  2. HDU3949:XOR(高斯消元)(线性基)

    传送门 题意 给出n个数,任意个数任意数异或构成一个集合,询问第k大个数 分析 这题需要用到线性基,下面是一些资料 1.高斯消元&线性基&Matirx_Tree定理 笔记 2.关于线性 ...

  3. bzoj2115 [Wc2011] Xor——高斯消元 & 异或线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 异或两次同一段路径的权值,就相当于没有走这段路径: 由此可以得到启发,对于不同的走法, ...

  4. BZOJ 4184 线段树+高斯消元

    思路: 线段树表示的是时间 每回最多log个段 区间覆盖 一直到叶子 的线性基 xor 一下 就是答案 一开始没有思路 看了这篇题解 豁然开朗 http://www.cnblogs.com/joyou ...

  5. BZOJ 4004: [JLOI2015]装备购买 [高斯消元同余 线性基]

    和前两(一)题一样,不过不是异或方程组了..... 然后bzoj的新数据是用来卡精度的吧..... 所有只好在模意义下做啦 只是巨慢无比 #include <iostream> #incl ...

  6. 【bzoj2115】[Wc2011] Xor DFS树+高斯消元求线性基

    题目描述 输入 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图 ...

  7. 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 490[Submit][Stat ...

  8. BZOJ 2466: [中山市选2009]树( 高斯消元 )

    高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...

  9. 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组

    [题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...

随机推荐

  1. TortoiseGit和git bash冲突解决

    软件版本 TortoiseGit版本: TortoiseGit 2.5.0.0 (C:\Program Files\TortoiseGit\bin) git version 2.8.1.windows ...

  2. 日常-acm-开灯问题

    开灯问题.有n盏灯,编号1-n.第一个人把所有的灯打开,第二个人按下所有编号为二的倍数的开关(全关掉),第三个人按下所有编号为三的倍数的开关,以此类推.一共k个人,问最后开着的灯的编号.输入n和k,输 ...

  3. springboot 测试

    本次测试使用的是springboot 中的测试 1.(对service 的测试)下面的测试.将会启动容器进行测试 @RunWith(SpringRunner.class) @SpringBootTes ...

  4. js判断是否为app

    var ua = navigator.userAgent; var isapp = ua.match("lenovomallapp") == null ? 0 : 1;

  5. window.addEventListener介绍说明

    原型 public override function addEventListener(type:String, listener:Function, useCapture:Boolean = fa ...

  6. 基于arcgis api for js高速公路智能化智慧公路养护WebGIS开源系统

    伴随着高速公路建设进程加快,其涉及信息量增大.类型多样.地点分布广,传统的信息管理方式已不适应公路建设迅速发展的需要,而目前能对高速公路在设计.施工.养护等阶段的各类信息综合进行管理的信息系统尚较少见 ...

  7. 第一课:PHP 文件是什么?

    PHP 文件是什么? PHP 文件可包含文本.HTML.JavaScript代码和 PHP 代码 PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器 PHP 文件的默认文件扩展名是 &q ...

  8. 【mysql】【转发】my.cnf 讲解

    PS:本配置文件针对Dell R710,双至强E5620.16G内存的硬件配置.CentOS 5.6 64位系统,MySQL 5.5.x 稳定版.适用于日IP 50-100w,PV 100-300w的 ...

  9. python并发编程之进程1(守护进程,进程锁,进程队列)

    进程的其他方法 P = Process(target=f,) P.Pid 查看进程号  查看进程的名字p.name P.is_alive()  返回一个true或者False P.terminate( ...

  10. Ubuntu系统里的python

    Ubuntu系统里,默认安装python2.7.x版本的python,直接执行python命令,打开的将是python 2.7.x版本:python3版本的需要自行安装,安装成功后,执行python3 ...