【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 ...
随机推荐
- squid 访问日志记录
squid日志记录在squid.conf 也可记录.并且squid日志可以不记录静态项 在squid.conf 加入 (1)access_log /var/log/squid/access.log ...
- 5分钟教程:如何通过UART获得root权限
写在前面的话 你知道物联网设备以及其他硬件制造商是如何调试和测试自家设备的吗?没错,绝大多数情况下,他们都会留下一个串行接口,这样就可以利用这个接口并通过shell来读取实时的调试日志或与硬件进行交互 ...
- JAVA反射机制--怎么不受泛型束缚给数组赋值
在Java中,声明数组的时候我们经常会写泛型限制用户输入或者获取的数据.如:ArrayList<String> list = new ArrayList<>(); String ...
- Swagger2 (3) 集成easymock 生成mock 测试数据
转载:http://blog.csdn.net/sai739295732/article/details/73957138 2.可以集成swagger 3.我们来玩一下 首先你需要一个swagger ...
- python项目导出所需要的依赖库
使用pip freeze $ pip freeze > requirements.txt 这种方式是把整个环境中的包都列出来了,如果是虚拟环境可以使用. 通常情况下我们只需要导出当前项目的req ...
- 关于websocket和ajax无刷新
HTTP无状态: Ajax只能实现用户和服务器单方面响应(单工机制). 如果设置为长轮询(ajax设置多少秒进行一次请求,时间间隙可能会有延迟,且浪费资源) 如果设置为长连接(客户端请求一次,服务器保 ...
- MySQL的四种变量类型
一.全局变量在系统运行期间动态更改其参数,重启后失效.SET GLOABL var=XXX;SET @@global.var=XXX;以上两种方式等效 查看系统的全局变量show global var ...
- 【经典数据结构】B树与B+树(转)
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...
- 设计模式之十八:桥接模式(Bridge)
桥接模式: 将抽象部分和它的实现部分相分离开来,以使它们能够单独地变化. UML图: 主要包含: Abstraction:定义了抽象部分的接口.操作一个实现部分对象的引用. RefinedAbstra ...
- TCP/IP详解 卷一(第十一章 UDP:用户数据报协议)
UDP是一个简单的面向数据报的运输层协议. UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地. UDP首部的个字段如下图所示