题目描述

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

每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且
让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大。
这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为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. Java 文件操作-File

    1.File文件操作 java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录.File类只用于表示文件(目录)的信息(名称.大小等),不能对文件的 ...

  2. ProtoBuff3 unity_TCP网络发包解包&&消息订阅

    using Google.Protobuf; //using Google.Protobuf.Examples.AddPerson; using Google.Protobuf.WellKnownTy ...

  3. Django form组件应用

    form 组件的使用 class Register(forms.Form): user = forms.CharField(min_length=2, widget=widgets.TextInput ...

  4. 徒手教你使用zookeeper编写服务发现

    zookeeper是一个强一致[不严格]的分布式数据库,由多个节点共同组成一个分布式集群,挂掉任意一个节点,数据库仍然可以正常工作,客户端无感知故障切换.客户端向任意一个节点写入数据,其它节点可以立即 ...

  5. ubuntu下安装eclipse<转>

    转载自http://my.oschina.net/u/1407116/blog/227084      http://my.oschina.net/u/1407116/blog/227087 一 JD ...

  6. Python 继承实现的原理(继承顺序)

    继承顺序 Python3 : 新式类的查找顺序:广度优先 新式类的继承: class A(object): Python2 3 都是了 MRO算法--生成一个列表保存继承顺序表 不找到底部 Pytho ...

  7. WPF DataGridCheckBoxColumn需要点两次才能修改checkbox状态

    如题,如果必须要用DataGridCheckBoxColumn使用一下方式就可以解决需要点击两次才能改状态的问题 <DataGridCheckBoxColumn> <DataGrid ...

  8. javaweb基础(6)_servlet配置参数

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  9. C# 数据结构 - 单链表 双链表 环形链表

    链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...

  10. Dede常用标记

    http://fontawesome.dashgame.com/ 字体图标使用方法 http://www.iconfont.cn/ 阿里的图标库 https://icomoon.io/ 字体制作 时间 ...