【BZOJ-4184 】 Shallot 线段树按时间分治 + 线性基
4184: shallot
Time Limit: 30 Sec Memory Limit: 128 MB
Submit: 356 Solved: 180
[Submit][Status][Discuss]
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
Source
Solution
新姿势,线段树对时间分治。
询问可以直接利用线性基贪心求解,问题在于线性基不支持删除操作。
考虑对时间分治,就是按时间建线段树,对于一个数,得到他的存在时间区间$[l,r]$,然后对线段树上相应节点记录这个数。
最后DFS线段树,在叶子节点求解。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
inline int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} #define MAXN 500010 int N; struct SgtNode{
int l,r; vector<int>a;
}tree[MAXN<<2]; struct LNode{
int a[31];
LNode() {memset(a,0,sizeof(a));}
int& operator [] (const int i) {
return a[i];
}
}la; inline void Insert(LNode &la,int x)
{
for (int i=30; i>=0; i--) {
if ((x>>i)&1) {
if (!la[i]) {la[i]=x; break;}
else x^=la[i];
}
}
} map<int,int>tim; inline void Build(int now,int l,int r)
{
tree[now].l=l; tree[now].r=r; tree[now].a.clear();
if (l==r) return;
int mid=(l+r)>>1;
Build(now<<1,l,mid); Build(now<<1|1,mid+1,r);
} inline void Update(int now,int L,int R,int val)
{
int l=tree[now].l,r=tree[now].r;
if (L<=l && R>=r) {
tree[now].a.push_back(val);
return;
}
int mid=(l+r)>>1;
if (L<=mid) Update(now<<1,L,R,val);
if (R>mid) Update(now<<1|1,L,R,val);
} inline void Query(int now,LNode LA)
{
int l=tree[now].l,r=tree[now].r;
for (int i=0; i<tree[now].a.size(); i++)
Insert(LA,tree[now].a[i]);
if (l==r) {
int ans=0;
for (int i=30; i>=0; i--)
if ((ans^LA[i])>ans) ans^=LA[i];
printf("%d\n",ans);
return;
}
Query(now<<1,LA); Query(now<<1|1,LA);
} int main()
{
N=read(); int st=((1LL<<31)-1);
for (int i=1; i<=N; i++) {
int x=read(); tim[x]=i;
if (x>0) st=min(st,x);
} Build(1,1,N); for (map<int,int>::iterator i=tim.find(st); i!=tim.end(); i++) {
int x=i->first,tl=i->second,tr=tim[-x] ? (tim[-x]-1):N;
Update(1,tl,tr,x);
// printf("%d %d %d\n",x,tl,tr);
} Query(1,la); return 0;
} /*
6
1 2 3 4 -2 -3
*/
【BZOJ-4184 】 Shallot 线段树按时间分治 + 线性基的更多相关文章
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- bzoj 4184 shallot——线段树分治+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 本来想了可持久化trie,不过空间是 nlogn (出一个节点的时候把 tot 复原就 ...
- 【CF576E】Painting Edges 线段树按时间分治+并查集
[CF576E]Painting Edges 题意:给你一张n个点,m条边的无向图,每条边是k种颜色中的一种,满足所有颜色相同的边内部形成一个二分图.有q个询问,每次询问给出a,b代表将编号为a的边染 ...
- 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包
题目描述 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 输入 第一行输入一个整数n, ...
- BZOJ_4025_二分图_线段树按时间分治+并查集
BZOJ_4025_二分图_线段树按时间分治+并查集 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简 ...
- BZOJ_4311_向量_线段树按时间分治
BZOJ_4311_向量_CDQ分治+线段树按时间分治 Description 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y) ...
- BZOJ_4184_shallot_线段树按时间分治维护线性基
BZOJ_4184_shallot_线段树按时间分治维护线性基 Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻 ...
- Bipartite Checking CodeForces - 813F (线段树按时间分治)
大意: 动态添边, 询问是否是二分图. 算是个线段树按时间分治入门题, 并查集维护每个点到根的奇偶性即可. #include <iostream> #include <sstream ...
- CodeForces 587 E.Duff as a Queen 线段树动态维护区间线性基
https://codeforces.com/contest/587/problem/E 一个序列, 1区间异或操作 2查询区间子集异或种类数 题解 解题思路大同小异,都是利用异或的性质进行转化,st ...
随机推荐
- JAVA记录-JSP内容
JSP(JavaServer Pages )是什么? JavaServer Pages(JSP)是一种支持动态内容开发的网页技术它可以帮助开发人员通过利用特殊的JSP标签,其中大部分以<%开始并 ...
- python 基础部分重点复习整理--从意识那天开始进阶--已结
pythonic 风格编码 入门python好博客 进阶大纲 有趣的灵魂 老齐的教程 老齐还整理了很多精华 听说 fluent python + pro python 这两本书还不错! 元组三种遍历, ...
- jQuery1.11源码分析(3)-----Sizzle源码中的浏览器兼容性检测和处理[原创]
上一章讲了正则表达式,这一章继续我们的前菜,浏览器兼容性处理. 先介绍一个简单的沙盒测试函数. /** * Support testing using an element * @param {Fun ...
- python制作查找单词翻译的脚本
本人由于英语渣,在linux底下经常看文档,但是有没有想有道词典这种软件,所以遇到不懂的单词只能手动复制粘贴在网上查找,这样就很不方便,学了python之后,就试着自己尝试下个在命令行下查找单词翻译的 ...
- java Concurrent 中的数据结构
一:阻塞数据结构(线程安全) ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列. LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列. PriorityBl ...
- Android改进版CoverFlow效果控件
最近研究了一下如何在Android上实现CoverFlow效果的控件,其实早在2010年,就有Neil Davies开发并开源出了这个控件,Neil大神的这篇博客地址http://www.inter- ...
- 批量增加Linux系统账号、重置账号密码、FTP账号批量测试
批量增加Linux系统账号.重置账号密码是用Linux Shell脚本来做的:批量FTP账号测试是用Python脚本来做的.这些脚本都是读取一个用户名和密码文件,然后基于该用户名密码文件进行自动批量测 ...
- Java练习之使用StringBuilder
package string.demo; /* * 将数组变为字符串输出 */ public class StringBuilderTest { /** * @param args */ public ...
- Linux内核源码分析--内核启动之(2)Image内核启动(汇编部分)(Linux-3.0 ARMv7) 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4938389.html 在完成了zImage自解压之后,就跳转到了解压后的内核(也就是vmlinux的bin ...
- Linux进程托管与守护进程设置
引言 在上一篇<Linux启动之旅>中,我们了解了Linux启动过程,在该过程的最后一步,init进程拉起/etc/init.d/rcN.d/目录下指定的守护进程(daemon).假若自定 ...