bzoj 4184: shallot (线段树维护线性基)
题面


$ solution: $
这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式。像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树.......但是我们并没有真正把它与一些数据结构结合在一起过,像线性基,凸包都是只支持加入,不支持删除的。我们需要找一种 $ O(nlogn) $ 的方案让他们也支持删除。
本题就可以用线段树维护线性基,那它的原理是什么呢,它为什么能让线性基支持删除操作了呢?其实我们看到线段树时就可以知道,它其实是维护的是时间轴,线性基是只能加,那我们就让它在合适的时间加对应的东西,而线段树就是维护的后者。这里我们必须好好思考一下(这对我们思考题目建模很有必要),比如本题做法相当于在线段树每个节点都建了一个线性基,它用空间的消耗来换取了时间的优化,这个原理在主席树中也是可见一斑的。
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
#define pb push_back
#define midd int mid=(l+r)>>1
#define klr int k,int l,int r
#define zuo k<<1,l,mid
#define you k<<1|1,mid+1,r
using namespace std;
map<int,int> h;
vector<int> a[500005<<2];
int d[31];
int n,v,sl,sr;
int c[500005];
struct ji{
int b[31];
ji(){memset(b,0,sizeof(0));}
inline void add(int x){
for(rg i=30;i>=0;--i)
if(x&d[i]){
if(b[i])x^=b[i];
else {b[i]=x;return;}
}
}
inline int ask(){
int res=0;
for(rg i=30;i>=0;--i)
if(b[i]&&!(res&d[i]))res^=b[i];
return res;
}
}base;
inline int qr(){
char ch; int sign=1;
while((ch=getchar())<'0'||ch>'9')
if(ch=='-')sign=-1;
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res*sign;
}
inline void add(klr){
if(sl<=l&&r<=sr){ a[k].pb(-v); return ;}
midd; if(sl<=mid)add(zuo); if(sr>mid)add(you);
}
inline void dfs(klr,ji t){
for(rg i=0,j=a[k].size();i<j;++i) t.add(a[k][i]);
if(l==r){printf("%d\n",t.ask());return ;}
midd; dfs(zuo,t); dfs(you,t);
}
int main(){
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
n=qr();
for(rg i=30;i>=0;--i)d[i]=1<<i;
for(rg i=1;i<=n;++i){
if((c[i]=v=qr())>=0)h[v]=i;
else sl=h[-v],h[-v]=0,sr=i-1,add(1,1,n);
}
for(rg i=1;i<=n;++i)
if(c[i]>0&&h[c[i]])
sl=h[c[i]],sr=n,v=-c[i],add(1,1,n);
dfs(1,1,n,base);
return 0;
}
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 复原就 ...
- 【BZOJ4184】shallot 线段树+vector+线性基
[BZOJ4184]shallot Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从 ...
- BZOJ4184:shallot(线段树分治,线性基)
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱 ...
- 2017西安区域赛A / UVALive - 8512 线段树维护线性基合并
题意:给定\(a[1...n]\),\(Q\)次询问求\(A[L...R]\)的异或组合再或上\(K\)的最大值 本题是2017的西安区域赛A题,了解线性基之后你会发现这根本就是套路题.. 只要用线段 ...
- 线段树维护线性基并——17西安icpc a
#include<bits/stdc++.h> using namespace std; #define N 10005 int a[N],n,k,q; struct LB{ ]; LB( ...
- 牛客多校第三次B——线段树维护线性基交
写线性基交函数时调试了半天.. #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn ...
- $CF938G\ Shortest\ Path\ Queries$ 线段树分治+线性基
正解:线段树分治+线性基 解题报告: 传送门$QwQ$ 考虑如果只有操作3,就这题嘛$QwQ$ 欧克然后现在考虑加上了操作一操作二 于是就线段树分治鸭 首先线段树叶子节点是询问嘛这个不用说$QwQ$. ...
- LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset
题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...
随机推荐
- npm指向淘宝源
临时 npm --registry https://registry.npm.taobao.org install express1 持久 npm config set registry https: ...
- Nginx, HTTPS的配置
server {listen 443; ####HTTPS指定端口server_name www.web.com; #####域名或者IP root /data/wwwroot/l ...
- Shell基础知识(六)
shell中有很多内建命令,如何区分内建命令与外部文件,使用type command即可看到命令类型. >> type cd # input << cd is a Shell ...
- Mysql distinct、group by
具体业务场景:根据某些字段组合去重得到所有字段结果. 遇到的error:sql_mode=only_full_group_by. 原因是mysql配置问题. distinct: distinct这个关 ...
- poco logging
http://pocoproject.org/slides/110-Logging.pdf
- ASP:当 request.cookies 发生 Microsoft VBScript 运行时错误 (0x800A000D) 类型不匹配: '[string:
昨天当一个客户告诉我,登录后看不到图片的时候,我还不相信,因为我的浏览器测试发现一切正常. 通过QQ远程协助后,我才发现服务器端真的报错: Microsoft VBScript 运行时错误 (0x80 ...
- 洛谷 P1140 相似基因(DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 参考资料: [1]:https://www.cnblogs.com/real-l/p/9 ...
- EOJ2018.10 月赛(A 数学+思维题)
传送门:Problem A https://www.cnblogs.com/violet-acmer/p/9739115.html 题意: 能否通过横着排或竖着排将 1x p 的小姐姐填满 n x m ...
- ngrep 比 tcpdump 更方便查看的抓包显示工具
ngrep 是grep(在文本中搜索字符串的工具)的网络版,他力求更多的grep特征,用于搜寻指定的数据包 一: ngrep的安装 CentOS6.2 64位 wget http://nchc.dl. ...
- ping的作用
Ping是潜水艇人员的专用术语,表示回应的声纳脉冲,在网络中Ping 是一个十分好用的TCP/IP工具.它主要的功能是用来检测网络的连通情况和分析网络速度. Ping有好的善的一面也有恶的一面.先说一 ...