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 线段树+高斯消元动态维护线性基
题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...
随机推荐
- CodeForces 21 A+B
Jabber ID 判断邮箱地址格式是否正确..一把心酸泪...跪11+,,看后台才过.. 注 ...
- Django学习之 - 基础模板语言
模板语言if/else/endif {% if today_is_weekend %} <p>Welcome to the weekend!</p> {% else %} &l ...
- tomcat的安装和使用
1.下载最新的tomcat:https://tomcat.apache.org/download-90.cgi 最新版本9.0.2属于beta版本,就没有必要尝鲜踩坑了 使用8.5.24的稳定版本的二 ...
- django 简易博客开发 1 安装、创建、配置、admin使用
首先贴一下项目地址吧 https://github.com/goodspeedcheng/sblog 到现在位置项目实现的功能有: 1.后台管理使用Admin ,前端显示使用bootstrap 2. ...
- 白话空间统计之四:P值和Z值(上):零如果
本来今天想要讲讲软件操作的,后来发现好像还有好几个重要的指标没有说,干脆等所有说完在讲操作吧.否则操作出来的结果会发现大量的"不明觉厉". 首先是空间统计里面非常神奇的两个值:P值 ...
- swiper插件制作轮播图swiper2.x和3.x区别
swiper3.x仅仅兼容到ie10+.比較适合移动端. swiper3.x官网 http://www.swiper.com.cn/ swiper2.x能够兼容到ie7+.官网是http://swi ...
- cocos2dx 制作单机麻将(五)
cocos2dx 制作单机麻将(五) 麻将逻辑6 最基础的4人麻将逻辑(轮流循环出牌, 之前学的都能用上 跑起来了!!!) 最基础的麻将逻辑 依据自己须要 设置麻将人数GAME_PLAYER 基本流 ...
- java SE基础(Collection接口概述)
Collection接口相关集成关系例如以下图 1. 关于可迭代接口(Iterable) 可迭代接口仅包括一个方法,返回一个在一组T类型元素上进行迭代的迭代器: public ...
- Swift基础一(代码)
import Foundation println("Hello, World!") var string1 = "Hello BeiJing" //定义一个变 ...
- 跟面试官讲Binder(零)
面试的时候,面试官问你说,简单说一下Android的Binder机制,你会怎么回答? 我想,我会这么说. 在Android启动的时候,Zygote进程孵化出第一个子进程叫SystemServer,而在 ...