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. Excel数据导入Sql Server出现Null(转)

    Excel文件: 序号 姓名 内部电话 住址 1 小李 1234 …… 2 小王 5678 …… 3 小张 2345(国内长途) …… …… …… …… …… 如上结构的Excel文件,用SQL Se ...

  2. java邮件工具类【最终版】

    http://www.xdemo.org/java-mail/ 对比链接中,添加了抄送和暗抄送功能(已解决,如图代码:抄送不能多个用户,会报错,未解之谜) sendHtmlmail方法可以发送附件以及 ...

  3. vagrant的学习 之 ThinkPHP3.2

    vagrant的学习 之 ThinkPHP3.2 (1)在web目录下新建tp32目录: cd /home/www/ mkdir tp32 (2)下载框架 我从ThinkPHP官网下载了ThinkPH ...

  4. CentOS6 Install kafka

    https://www.cnblogs.com/caoguo/p/5958608.html

  5. HDU 5883 欧拉路径异或值最大 水题

    The Best Path Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  6. [Bzoj5177][Jsoi2013]贪心的导游(主席树)

    5177: [Jsoi2013]贪心的导游 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 32  Solved: 15[Submit][Status] ...

  7. lombok注解

    官方文档:@EqualsAndHashCode 转:https://blog.csdn.net/zhanlanmg/article/details/50392266 1. 此注解会生成equals(O ...

  8. eclipse菜单字体乱码的解决

    方法一: 这个跟活动控制台代码页有关. 如果要更改为 UTF-8,则需要运行 chcp 命令: chcp 65001 有时新安装的系统可能在运行一些中文软件时显示错乱,可通过控制面板修改系统区域来管理 ...

  9. java中可以通过调用ping命令来判断网络是否连接正常

    原文:http://www.open-open.com/code/view/1446382328960 import java.io.BufferedReader; import java.io.IO ...

  10. 工作总结 使用html模板发邮件 前面空一大块

    HTML邮件的本质其实是发送了一个html页面.邮件的空白必然是页面的空白,所以你要找到你发送邮件的html模板所在,然后去掉空白即可,如果这是一个公共文件,需要注意你往往用的只是你的部分,很大程度还 ...