【BZOJ4184】shallot 线段树+vector+线性基
【BZOJ4184】shallot
Description
小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏。
Input
第一行一个正整数n表示总时间;第二行n个整数a1,a2...an,若ai大于0代表给了小葱一颗数字为ai的小葱苗,否则代表从小葱手中拿走一颗数字为-ai的小葱苗。
Output
输出共n行,每行一个整数代表第i个时刻的最大异或和。
Sample Input
1 2 3 4 -2 -3
Sample Output
3
3
7
7
5
HINT
N<=500000,Ai<=2^31-1
题解:因为线性基不支持删除操作,所以我们要考虑离线的做法
有一个性质很重要:每个数都存在于一段连续的区间,所以我们可以用map来记录区间的起始位置和结束位置,然后用线段树来实现区间操作。
具体方法是给线段树上的每一个节点都开一个vector,vector里维护的就是线性基,每次更新到一整块区间就在线性基中加入这个数,并维护线性基。查询的时候我们将每个点到根的路径上的所有的线性基再开一个vector扔进去,并维护线性基,然后贪心求出最大值就行了。
一开始感觉空间复杂度有点吓人,不过当我TLE时才发现其实内存完全不虚。
然后发现,算法的瓶颈其实在于查询操作,所以我们不能每次都进行单点查询,而是遍历整棵线段树,并输出所有的答案。
拍极限数据的时候我跑了6、7秒感觉GG,但是测了一下标程才发现标程比我的还慢,所以果断AC。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <map>
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxn=500010;
int n,m;
int last[maxn],A[maxn];
map<int,int> mp;
struct line
{
vector<int> v;
int gauss(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]);
}
return x;
}
int getmax()
{
int i,ret=0;
for(i=0;i<v.size();i++) if((ret^v[i])>ret) ret^=v[i];
return ret;
}
};
line s[maxn<<2],emp;
void updata(int l,int r,int x,int a,int b,int c)
{
if(a<=l&&r<=b)
{
s[x].gauss(c);
return ;
}
int mid=l+r>>1;
if(a<=mid) updata(l,mid,lson,a,b,c);
if(b>mid) updata(mid+1,r,rson,a,b,c);
}
void query(int l,int r,int x,line q)
{
for(int i=0;i<s[x].v.size();i++) q.gauss(s[x].v[i]);
if(l==r)
{
printf("%d\n",q.getmax());
return ;
}
int mid=l+r>>1;
query(l,mid,lson,q),query(mid+1,r,rson,q);
}
int main()
{
scanf("%d",&m);
int i,a;
for(i=1;i<=m;i++)
{
scanf("%d",&A[i]);
if(A[i]<0) a=mp[-A[i]],last[a]=i-1;
else mp[A[i]]=i;
}
for(i=1;i<=m;i++)
{
if(A[i]<0) continue;
if(!last[i]) last[i]=m;
updata(1,m,1,i,last[i],A[i]);
}
query(1,m,1,emp);
return 0;
}
【BZOJ4184】shallot 线段树+vector+线性基的更多相关文章
- BZOJ4184:shallot(线段树分治,线性基)
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱 ...
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- bzoj 4184 shallot 时间线建线段树+vector+线性基
题目大意 n个时间点 每个时间点可以插入一个权值或删除一个权值 求每个时间点结束后异或最大值 分析 异或最大值用线性基 但是线性基并不支持删除操作 我们可以对时间线建一棵线段树 离线搞出每个权值出现的 ...
- bzoj 4184 shallot——线段树分治+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 本来想了可持久化trie,不过空间是 nlogn (出一个节点的时候把 tot 复原就 ...
- bzoj 4184: shallot (线段树维护线性基)
题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...
- $CF938G\ Shortest\ Path\ Queries$ 线段树分治+线性基
正解:线段树分治+线性基 解题报告: 传送门$QwQ$ 考虑如果只有操作3,就这题嘛$QwQ$ 欧克然后现在考虑加上了操作一操作二 于是就线段树分治鸭 首先线段树叶子节点是询问嘛这个不用说$QwQ$. ...
- [BZOJ4184]shallot 线段树+线性基
链接 题意:给你每个数字出现的时间和消失的时间,求每个时刻最大异或和 题解 按照时间建立线段树,线段树每个节点开个vector存一下这个时间区间有哪些数,然后递归进入的时候加入线性基,开一个栈记录一下 ...
- LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset
题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...
- 【luogu3733】【HAOI2017】 八纵八横 (线段树分治+线性基)
Descroption 原题链接 给你一个\(n\)个点的图,有重边有自环保证连通,最开始有\(m\)条固定的边,要求你支持加边删边改边(均不涉及最初的\(m\)条边),每一次操作都求出图中经过\(1 ...
随机推荐
- python软件工程知识
软件工程知识 3.1 程序设计过程中,常用伪代码来"思考"一个程序,在将伪代码程序转换成python程序. 3.2 所有python程序都可以给予6类控制结构来创建(顺序,if, ...
- [转载]Install Opera 12.16 Web Browser in CentOS/RHEL and Fedora
FROM: http://tecadmin.net/install-opera-web-browser-in-centos-rhel-fedora/ Opera is an modern web br ...
- [转载]Redis后台启动
FROM: http://www.art-coder.com/2011/12/01/how-to-run-redis-server-as-daemon/ How to run Redis server ...
- eclispe查看jdk源码后特别卡顿导致未响应解决
第一步:Eclipse -> Preferences -> General -> Startup and Shutdown.不要勾选 RSE UI. 第二步:Eclipse -> ...
- odoo12新特性: 会计改进
改进分析会计 分析会计层级结构 分析分配 分析分录增加了表格视图 ============== SPECIFICATIONS ============== a. Hierarchy - Cr ...
- Web用户的身份验证及WebApi权限验证流程的设计和实现(续)
4.4 权限属性RequireAuthorizationAttribute [csharp] view plaincopy "font-size:14px;">/// / ...
- 浅谈struts2标签中的2个非经常常使用的标签的使用方法(radio和select)
1.如图所看到的我们须要在前台的页面通过radio和select将相应的数据库中的数据显示到选项其中,这也是我们做项目中常常须要做的,动态的显示,而不是静态的显示. 首先我们须要在页面中导入strut ...
- Ctrl/Alt 快捷键
Ctrl+S 保存 Ctrl+W 关闭程序 Ctrl+N 新建文档 Ctrl+O 打开(选择打开其他文档) Ctrl+Z 撤销 Ctrl+F 查找 Ctrl+X 剪切 Ct ...
- MySQL四-2:完整性约束
阅读目录 一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业 一 介绍 约束条件与数据 ...
- Spring 中的Null-Safety
之前一直在某些代码中看到过使用@Nullable 标注过的注释,当时也没有在意到底是什么意思,所以这篇文章来谈谈Spring中关于Null的那些事. 在Java中不允许让你使用类型表示其null的安全 ...