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,查了查发现环上的值直 ...
随机推荐
- BZOJ3834[Poi2014]Solar Panels——分块
题目描述 Having decided to invest in renewable energy, Byteasar started a solar panels factory. It appea ...
- MT【216】韦达定理
设$n$为正整数,$a_1,a_2,\cdots,a_n;b_1,b_2,\cdots,b_n;A,B$都是正数, 满足$a_i\le b_i,a_i\le A,i=1,2,\cdots,n$ 且$\ ...
- 19+ JavaScript 常用的简写技巧
博主说:对于任何基于 JavaScript 的开发人员来说,这绝对是一篇必读的文章,乃提升开发效率之神器也. 正文 js 1. 三元运算符 当你想用一行代码来写if...else语句的时候,使用三元操 ...
- 06 自学Aruba之win7系统802.1x认证网卡设置指导
点击返回:自学Aruba之路 06 自学Aruba之win7系统802.1x认证网卡设置指导 步骤1.在桌面任务栏找到“打开网络和共享中心”,点击进入: 步骤2.点击“管理无线网络”,进入无线网络配置 ...
- 自学Linux Shell16.2-函数中使用变量
点击返回 自学Linux命令行与Shell脚本之路 16.2-函数中使用变量 1. 向函数传递参数 函数可以使用标准参数环境变量来表示命令行传递给函数的参数.例如, 函数名在变量$0中定义,函 ...
- 自学Zabbix9.4 zabbix low-level discover底层发现(zabbix批量部署必备)
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix9.4 zabbix low-level discover底层发现(zabbix批 ...
- android限制横竖屏切换 方法
在需要限制横竖屏切换的时候,只需要在AndroidManifest.xml文件中加入android:screenOrientation属性限制. android:screenOrientation=& ...
- Android Service服务的生命周期
与activity类似,服务也存在生命周期回调方法,你可以实现这些方法来监控服务的状态变化,并在适当的时机执行一些操作. 以下代码提纲展示了服务的每个生命周期回调方法: public class Ex ...
- NOI2018退役记
NOI2018退役记 终于我也退役了-- Day0 高中毕业前最后一次坐飞机了--在机场干什么呢?当然是打元气打元气打元气.下飞机干什么呢?当然是打元气打元气打元气. 有接机服务,大巴上有个导游,又向 ...
- 【翻译】go memory model
https://studygolang.com/articles/819 原文链接 Introduction The Go memory model specifies the conditions ...