BZOJ_4184_shallot_线段树按时间分治维护线性基

Description

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

每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且
让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大。
这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为Oi选手的你,你能帮帮他吗?
你只需要输出最大的异或和即可,若小葱手中没有小葱苗则输出0。

Input

第一行一个正整数n表示总时间;第二行n个整数a1,a2...an,若ai大于0代表给了小葱一颗数字为ai的小葱苗,否则代表从小葱手中拿走一颗数字为-ai的小葱苗。

Output

输出共n行,每行一个整数代表第i个时刻的最大异或和。

Sample Input

6

1 2 3 4 -2 -3

Sample Output

1
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_线段树按时间分治维护线性基的更多相关文章

  1. 【BZOJ-4184 】 Shallot 线段树按时间分治 + 线性基

    4184: shallot Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 356  Solved: 180[Submit][Status][Discu ...

  2. 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包

    题目描述 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 输入 第一行输入一个整数n, ...

  3. BZOJ_4311_向量_线段树按时间分治

    BZOJ_4311_向量_CDQ分治+线段树按时间分治 Description 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y) ...

  4. Bipartite Checking CodeForces - 813F (线段树按时间分治)

    大意: 动态添边, 询问是否是二分图. 算是个线段树按时间分治入门题, 并查集维护每个点到根的奇偶性即可. #include <iostream> #include <sstream ...

  5. 【CF576E】Painting Edges 线段树按时间分治+并查集

    [CF576E]Painting Edges 题意:给你一张n个点,m条边的无向图,每条边是k种颜色中的一种,满足所有颜色相同的边内部形成一个二分图.有q个询问,每次询问给出a,b代表将编号为a的边染 ...

  6. BZOJ_4025_二分图_线段树按时间分治+并查集

    BZOJ_4025_二分图_线段树按时间分治+并查集 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简 ...

  7. 【BZOJ4184】shallot(线段树分治,线性基)

    [BZOJ4184]shallot(线段树分治,线性基) 题面 权限题啊.....好烦.. Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把 ...

  8. bzoj 4184: shallot (线段树维护线性基)

    题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...

  9. 【bzoj4184】shallot 线段树+高斯消元动态维护线性基

    题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...

随机推荐

  1. PHP文件属性相关函数

    <meta charset= "utf-8"><?php //获取文件属性的函数 function getFilePro($filename) { //检测文件是 ...

  2. express 写接口

    实例下载:百度云盘免密码 (): 指注释 一.准备工作 1.安装express npm install express -g npm install express-generator -g 2.初始 ...

  3. zoj4027 Sequence Swapping

    首先容易想到二维方程dp(i,j),表示第i个左括号去匹配到第j个右括号时产生的最大值,但如果如此表示的话,首先需要枚举(i,j)以及一个k即dp(i-1,k). 考虑变化dp(i,j)的表示方法,可 ...

  4. 实现浏览器兼容的innerText

    今天学习到了FF不支持innerText,而IE.chrome.Safari.opera均支持innerText. 为了各个浏览器能兼容innerText,必须对js做一次封装. 为啥能实现兼容呢?原 ...

  5. [Bzoj3631][JLOI2014]松鼠的新家 (树上前缀和)

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2350  Solved: 1212[Submit][Sta ...

  6. Tomcat错误信息(服务器版本号)泄露(低危)

    一.问题描述Tomcat报错页面泄漏Apache Tomcat/7.0.52相关版本号信息,是攻击者攻击的途径之一.因此实际当中建议去掉版本号信息. 二.解决办法 1.进入到tomcat/lib目录下 ...

  7. win10安装mysql5.6,mysql启动时,闪退

    首先在服务中查看是不是mysql启动了 发现在服务中没有mysql服务, 然后找到mysql的安装目录 MYSQL SERVER 5.6 中将my-default.ini 改为my.ini 使用命令行 ...

  8. Spring的AOP AspectJ切入点语法详解(转)

    一.Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示 ...

  9. LINUX下安装和配置WEBLOGIC10.0.3

    weblogic for linux安装 首先声明,我参考了某位原创者的笔记,加以整理的.安装1. 安装前的准备工作1.1 首先请确认您要安装的Weblogic版本所在的平台已通过了BEA的认证,完整 ...

  10. HDU1087 Super Jumping! Jumping! Jumping!(LIS)

    题目意思: http://acm.hdu.edu.cn/showproblem.php? pid=1087 此题的意思求最长上升子序列的和. 题目分析: 在求最长上升子序列的时候,不在保存最长的个数, ...