「bzoj 4184: shallot」
线段树分治加线性基
首先这个题要求删除线性基肯定是没法处理的
于是我们套上一个线段树分治
线段树分治就是一种能够避免删除的神仙操作
我们发现询问是对一个时间的单点询问,而每一个数存在的时间却是一个区间
我们求出来每个数的存在区间,每一个区间对应在线段树上并不会超过\(logn\)段
我们就把这些存活区间插入到线段树里去,标记永久化一下
由于一个线性基也就是\(logn\)的空间,所以我们直接一路把线性基搞下来,中间把标记插入线性基就好了
到叶子结点我们就可以处理询问了
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define LL long long
#define re register
#define maxn 500005
inline int read() {
char c=getchar();int x=0,r=1;
while(c<'0'||c>'9') {if(c=='-') r=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3ll)+(x<<1ll)+c-48,c=getchar();return x*r;
}
struct Base {
int lb[33];
inline void ins(int x) {
for(re int i=31;i>=0;--i)
if(x>>i&1) {
if(!lb[i]) {lb[i]=x;return;}
x^=lb[i];
}
}
inline int query() {
int ans=0;
for(re int i=31;i>=0;--i) if((ans^lb[i])>ans) ans^=lb[i];
return ans;
}
}A;
std::vector<int> v[maxn*3];
int n,m,sz,tot;
int lst[maxn],nxt[maxn],L[maxn],R[maxn],val[maxn],ans[maxn],c[maxn],a[maxn];
inline int find(int x) {
int l=1,r=sz;
while(l<=r) {
int mid=l+r>>1;
if(c[mid]==x) return mid;
if(c[mid]<x) l=mid+1;else r=mid-1;
}
return 0;
}
void change(int l,int r,int x,int y,int val,int i) {
if(x<=l&&y>=r) {v[i].push_back(val);return;}
int mid=l+r>>1;
if(x<=mid) change(l,mid,x,y,val,i<<1);
if(y>=mid+1) change(mid+1,r,x,y,val,i<<1|1);
}
void solve(int l,int r,int i,Base A) {
for(re int j=0;j<v[i].size();j++)
A.ins(v[i][j]);
if(l==r) {
ans[l]=A.query();
return;
}
int mid=l+r>>1;
solve(l,mid,i<<1,A);solve(mid+1,r,i<<1|1,A);
}
int main() {
n=read();
for(re int i=1;i<=n;i++) a[i]=read();
for(re int i=1;i<=n;i++) c[i]=((a[i]>0)?a[i]:-1*a[i]);
std::sort(c+1,c+n+1);sz=std::unique(c+1,c+n+1)-c-1;
for(re int i=1;i<=n;i++) {
int x=find((a[i]>0)?a[i]:-1*a[i]);
if(a[i]>0) {
nxt[i]=lst[x],lst[x]=i;
}
else {
L[++tot]=lst[x];R[tot]=i-1;val[tot]=-1*a[i];
lst[x]=nxt[lst[x]];
}
}
for(re int i=1;i<=sz;i++)
while(lst[i]) L[++tot]=lst[i],R[tot]=n,val[tot]=c[i],lst[i]=nxt[lst[i]];
for(re int i=1;i<=tot;i++)
change(1,n,L[i],R[i],val[i],1);
solve(1,n,1,A);
for(re int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}
「bzoj 4184: shallot」的更多相关文章
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- BZOJ 4184: shallot
Description 在某时刻加入或删除一个点,问每个时刻的集合中能异或出来的最大值是多少. Sol 线段树+按时间分治+线性基. 按时间分治可以用 \(logn\) 的时间来换取不进行删除的操作. ...
- bzoj 4184 shallot——线段树分治+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 本来想了可持久化trie,不过空间是 nlogn (出一个节点的时候把 tot 复原就 ...
- bzoj 4184: shallot (线段树维护线性基)
题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...
- 「bzoj 4025: 二分图」
题目 显然二分图没有奇环 于是考虑使用并查集维护一下看看是否存在奇环 我们可以考虑加权并查集,维护出\(x\)到\(fa_x\)的实际距离 由于我们只需要考虑奇偶性,于是我们处理出到根的路径异或一下就 ...
- 「bzoj 3944: Sum」
题目 杜教筛板子了 #include<iostream> #include<cstring> #include<cstdio> #include<cmath& ...
- BZOJ 4184 shallot 线性基+分治
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从 ...
- bzoj 4184 shallot 时间线建线段树+vector+线性基
题目大意 n个时间点 每个时间点可以插入一个权值或删除一个权值 求每个时间点结束后异或最大值 分析 异或最大值用线性基 但是线性基并不支持删除操作 我们可以对时间线建一棵线段树 离线搞出每个权值出现的 ...
- bzoj 4184: shallot【线性基+时间线段树】
学到了线段树新姿势! 先离线读入,根据时间建一棵线段树,每个节点上开一个vector存这个区间内存在的数(使用map来记录每个数出现的一段时间),然后在线段树上dfs,到叶子节点就计算答案. 注意!! ...
随机推荐
- SqlServer常用语句
首先,写这个的原因是我其实sql语句不太行,总觉得自己写得很乱,好像也没有系统学习过,借此复习和与大家探讨 No.1 关于查询时间区间是否重叠的sql语句 问题是这样:插入之前,想查询同User是否其 ...
- 微信授权错误:"errcode":40163,"errmsg":"codebeenused
微信网页授权获取code值回调两次的问题 1.说是域名原因,目前未测试,没有正确的域名 问题描述:在调用微信网页授权获取openid值时,先获取的code值,但是code值的接口 会走两次回调.而co ...
- sql sever 执行较大的文件脚本
1.用管理员身份打开cmd工具 2.执行命令 osql -S localhost -U sa -P 123456 -i D:/test.sql -S 服务器地址 本地可简写 . -U 用户名 -P ...
- Groovy中的操作符重载
操作者 方法 a + b a.plus(b)中 a - b a.minus(b)中 a * b a.multiply(b)中 a ** b a.power(b)中 a / b a.div(b)中 a ...
- 使用Mac自带svn搭建服务器,并使用idea进行连接
一.检查Mac自带SVN版本号 二.创建代码仓库 $ mkdir -p /Users/Shared/svn/repository $ svnadmin create /Users/Shared/svn ...
- Chromium base库分割字符串SplitString
前一段时间在工作过程中遇到一个场景需要将http response中的request header中的cookie字段取出并进行解析,但是手头没有解析cookie的工具类,同时cookie的表现就是个 ...
- css的高级选择器,后代选择器,子代选择器,并集选择器,交集选择器
高级选择器: 后代选择器 子代选择器 并集选择器 交集选择器 一.后代选择器: 使用空格表示后代选择器,父元素的后代(包括儿子,孙子,从孙子) 也就是说,box类下的所有span标签 字体颜色都被设置 ...
- TAT
瞎扯 继\(HNOI,\)学科\(,CTSC, APIO\)连续爆炸之后 曾一度的怀疑人生,没有任何搞学习的欲望 不断的反省自己:我为什么这么菜? 然后回去搞学科,一直处于一个颓废的状态 后来得知\( ...
- Bootstrap 3.0的扁平化来了
Bootstrap 3 RC1 发布了,从官方上看,Bootstrap 3 似乎也开始趋于扁平化的风格设计. 网站UI和Button bootstrap 2.3.2以下的整体UI和图标是以box-sh ...
- C# 读取excel用户列表过滤一个月内未收到外部邮件已离职的员工
1.通过aspose.cells读取excel中的数据并添加到list中 //存储从excel中读取出来的数据 List<UserInfo> lst_userinfo = new List ...