BZOJ_4184_shallot_线段树按时间分治维护线性基
BZOJ_4184_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
感觉学到一个有用的东西。
有些问题支持插入但不支持删除或者支持删除但不支持插入。
这时我们可以发现每个元素在时间轴上都出现了一段区间,然后这个区间用线段树来维护。
比如这道题,我们知道线性基支持O(logn)的插入但不支持快速删除一个元素。
于是线段树每个节点维护一颗线性基。
我们可以求出每个数出现的区间,把这段区间在线段树上对应的log个节点插入这个数。
最后dfs一遍线段树,每次暴力pushdown,每个叶子就对应着这一个时间点的答案。
这样空间复杂度是O(4nlogn)的,过不去。
线段树每个节点没必要真开出来一个线性基,在下传的时候加一个线性基的参数即可。
这样意味着我们区间修改时不能直接插入,可以先用vector存下每个节点对应要插哪些数。
然后再把标记下传,这样空间是vector的O(nlogn),可过。
本题数据保证不会出现形如A....A....-A....-A的情况,于是求每个数对应的区间可以直接用map求。
代码:
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
#define N 500050
#define ls p<<1
#define rs p<<1|1
map<int,int>mp;
vector<int>v[N<<2];
struct LB {
int b[31];
LB() {memset(b,0,sizeof(b));}
void insert(int x) {
int i;
for(i=30;i>=0;i--) if(x&(1<<i)) {
if(b[i]) x^=b[i];
else {
b[i]=x; return ;
}
}
}
int query() {
int ans=0,i;
for(i=30;i>=0;i--) {
if(b[i]) ans=max(ans,b[i]^ans);
}
return ans;
}
};
int n,ans[N],a[N];
void update(int l,int r,int x,int y,int va,int p) {
if(x<=l&&y>=r) {v[p].push_back(va); return ;}
int mid=(l+r)>>1;
if(x<=mid) update(l,mid,x,y,va,ls);
if(y>mid) update(mid+1,r,x,y,va,rs);
}
void solve(int l,int r,int p,LB t) {
int i,lim=v[p].size();
for(i=0;i<lim;i++) {
t.insert(v[p][i]);
}
if(l==r) {
ans[l]=t.query(); return ;
}
int mid=(l+r)>>1;
solve(l,mid,ls,t);
solve(mid+1,r,rs,t);
}
int main() {
scanf("%d",&n);
int i,x;
for(i=1;i<=n;i++) {
scanf("%d",&a[i]);
if(a[i]>0) mp[a[i]]=i;
else update(1,n,mp[-a[i]],i-1,-a[i],1),mp[-a[i]]=0;
}
for(i=1;i<=n;i++) {
if(a[i]>0&&mp[a[i]]) update(1,n,mp[a[i]],n,a[i],1);
}
LB base; memset(base.b,0,sizeof(base));
solve(1,n,1,base);
for(i=1;i<=n;i++) printf("%d\n",ans[i]);
}
BZOJ_4184_shallot_线段树按时间分治维护线性基的更多相关文章
- 【BZOJ-4184 】 Shallot 线段树按时间分治 + 线性基
4184: shallot Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 356 Solved: 180[Submit][Status][Discu ...
- 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包
题目描述 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 输入 第一行输入一个整数n, ...
- BZOJ_4311_向量_线段树按时间分治
BZOJ_4311_向量_CDQ分治+线段树按时间分治 Description 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y) ...
- Bipartite Checking CodeForces - 813F (线段树按时间分治)
大意: 动态添边, 询问是否是二分图. 算是个线段树按时间分治入门题, 并查集维护每个点到根的奇偶性即可. #include <iostream> #include <sstream ...
- 【CF576E】Painting Edges 线段树按时间分治+并查集
[CF576E]Painting Edges 题意:给你一张n个点,m条边的无向图,每条边是k种颜色中的一种,满足所有颜色相同的边内部形成一个二分图.有q个询问,每次询问给出a,b代表将编号为a的边染 ...
- BZOJ_4025_二分图_线段树按时间分治+并查集
BZOJ_4025_二分图_线段树按时间分治+并查集 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简 ...
- 【BZOJ4184】shallot(线段树分治,线性基)
[BZOJ4184]shallot(线段树分治,线性基) 题面 权限题啊.....好烦.. Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把 ...
- bzoj 4184: shallot (线段树维护线性基)
题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...
- 【bzoj4184】shallot 线段树+高斯消元动态维护线性基
题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...
随机推荐
- LibreOJ2302 - 「NOI2017」整数
Portal Description 有一个整数\(x=0\),对其进行\(n(n\leq10^6)\)次操作: 给出\(a(|a|\leq10^9),b(b\leq30n)\),将\(x\)加上\( ...
- 解决Genymotion运行Android 5.0一直卡在开机界面
在一些机器,启动genymotion 的android5.0版模拟器时,会卡在启动界面,一直启动不了. 这是因为要求的开启虚拟选项没有打开,在第一次启动时,会有提示,但可能大家没有注意(我也没注意到, ...
- 使用windows操作EXCEL如何关闭EXCEL进程
经常项目上有导入excel的需求,其实导入一个固定格式的excel数据非常容易,但是,发现一个问题就是,导入excel后,用户在打开excel时,必须要打开2次才能打开excel,这让人很不爽:开始查 ...
- hdu 4046 Panda [线段树]
Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 一份关于webpack2和模块打包的新手指南(一)
webpack已成为现代Web开发中最重要的工具之一.它是一个用于JavaScript的模块打包工具,但是它也可以转换所有的前端资源,例如HTML和CSS,甚至是图片.它可以让你更好地控制应用程序所产 ...
- js正则匹配身份证号 有坑
// 不能加g,每次匹配会以lastIndex为起始位去查找 // 若加g,匹配到会用最后一位的index去改变lastIndex,没有匹配到则会把lastIndex重置为0 // 不加g,lastI ...
- P2863 [USACO06JAN]牛的舞会The Cow Prom
洛谷——P2863 [USACO06JAN]牛的舞会The Cow Prom 题目描述 The N (2 <= N <= 10,000) cows are so excited: it's ...
- js如何获取一个object的第一个数据
var obj = { "1":"123", "2":"456" } console.info( obj[Object. ...
- java的计时:毫秒、纳秒
System.currentTimeMillis()获取毫秒值,但是其精度依赖操作系统 想实现较为精确的毫秒,可以采用 System.nanoTime()/1000000L System.nanoTi ...
- 矩阵奇异值分解(SVD)
转自:https://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html (感谢,讲解的太好了) 在机器 ...