【BZOJ4184】shallot 线性基
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4184
此题如果我们不考虑删除元素这一个操作,那么就是一道裸的线性基题。
但是此题会删除元素,且允许离线。
我最初的想法是开一个线段树,然后通过两个线性基的合并去更新答案。
后来发现,一个元素出现的时间段其实是确定的。
我们种一棵线段树,用来维护哪些元素在哪些时间段出现过。
我们在线段树的每个节点上开一个vector,用来存储哪些元素在该节点所表示的时间段上出现过。
最后统计答案一个dfs即可。
第一次交上去我被卡常了,后来换了静态链表才过了。
1 #include<bits/stdc++.h> 2 #define M 500005 3 using namespace std; 4 int n,m,num[M]={0},q[M]={0}; 5 struct edge{int u,next;}e[M*20]={0}; int head[M*4]={0},use=0; 6 void add(int x,int y){use++;e[use].u=y;e[use].next=head[x];head[x]=use;} 7 void updata(int x,int ll,int rr,int l,int r,int k){ 8 if(l<=ll&&rr<=r){add(x,k);return;} 9 int mid=(ll+rr)>>1; 10 if(l<=mid) updata(x<<1,ll,mid,l,r,k); 11 if(mid<r) updata(x<<1|1,mid+1,rr,l,r,k); 12 } 13 struct node{ 14 int a[31]; 15 node(){memset(a,0,sizeof(a));} 16 void insert(int x){ 17 for(int i=30;~i;i--) 18 if(x&(1<<i)){ 19 if(!a[i]) {a[i]=x; return;} 20 else x^=a[i]; 21 } 22 } 23 int ans(){ 24 int ans=0; 25 for(int i=30;~i;i--) 26 ans=max(ans,a[i]^ans); 27 return ans; 28 } 29 }; 30 map<int,int> mp; 31 void dfs(int x,int l,int r,node k){ 32 for(int i=head[x];i;i=e[i].next) k.insert(e[i].u); 33 if(l==r){ 34 printf("%d\n",k.ans()); 35 return; 36 } 37 int mid=(l+r)>>1; 38 dfs(x<<1,l,mid,k); dfs(x<<1|1,mid+1,r,k); 39 } 40 int main(){ 41 scanf("%d",&m); 42 for(int i=1;i<=m;i++){ 43 int x; scanf("%d",&x); 44 if(x>0) mp[x]=i; 45 else{ 46 int l=mp[-x]; 47 updata(1,1,m,l,i-1,-x); 48 mp.erase(-x); 49 } 50 } 51 map<int,int>::iterator it; 52 for(it=mp.begin();it!=mp.end();it++){ 53 int l=it->second,x=it->first; 54 //cout<<l<<' '<<x<<endl; 55 updata(1,1,m,l,m,x); 56 } 57 node hh; 58 dfs(1,1,m,hh); 59 }
转载于:https://www.cnblogs.com/xiefengze1/p/8783670.html
【BZOJ4184】shallot 线性基相关推荐
- BZOJ 4184 shallot 线性基+分治
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从 ...
- BZOJ 4184: shallot 线性基+线段树分治
复习一下线性基 ~ code: #include <cmath> #include <vector> #include <cstdio> #include < ...
- 【BZOJ 4184】shallot 线性基
一开始一直没有想到因为只是在一直思考线性上怎么做,结果这道题很巧妙的运用的是在线段树上,因为每一个数字的影响其实只是在一段区间上的,这个=很显然,然后就类似于线段树上区间修改打懒惰标记,最后全部dfs ...
- 【BZOJ4184】shallot 线段树+vector+线性基
[BZOJ4184]shallot Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从 ...
- 【BZOJ4184】shallot(线段树分治,线性基)
[BZOJ4184]shallot(线段树分治,线性基) 题面 权限题啊.....好烦.. Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把 ...
- 【BZOJ4184】Shallot(线性基,线段树分治)
Description 可支持插入.删除.求最大异或值的线性基. Solution 插入.求最大异或值都比较基础. 其实删除也是套路吧,,直接建一棵时间线段树即可. Code /*********** ...
- 【bzoj4184】shallot 线段树+高斯消元动态维护线性基
题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...
- [BZOJ4184]shallot 线段树+线性基
链接 题意:给你每个数字出现的时间和消失的时间,求每个时刻最大异或和 题解 按照时间建立线段树,线段树每个节点开个vector存一下这个时间区间有哪些数,然后递归进入的时候加入线性基,开一个栈记录一下 ...
- NKOJ 3652 shallot (线性基+CDQ分治)
P3652 shallot 问题描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗 ...
最新文章
- 让你的javascript函数拥有记忆功能,降低全局变量的使用
- 参考答案:03 向量空间
- windows2003权限如何配置
- 【Linux】安装CUDA和cudnn
- centos中bash占用cpu_Docker 多种维度限制容器可用的 CPU
- win7提示Xshell5提示缺少msvcp110.dll解决办法
- 让我们来比较C#,C++和Java之间重写虚函数的区别
- mysql 添加最高权限设置_mysql 添加用户并设置权限
- MySQL误删数据救命指南:必收藏
- android重写返回按钮点击事件,Android Fragment监听返回键
- 分组取出值最大的数据
- 使用struct与typedef定义结构体
- linux-文件系统格式区别xfs、ext4、ext3、ext2、vfat、swap、EFI system partition
- 数据库系统和文件系统的区别
- PTA 基础编程题目集 7-15 计算圆周率 C语言
- js字符串转json, json转字符串
- 2020年Web前端面试题及答案----CSS篇
- 1665 完成所有任务的最少初始能量
- 【转】WPF自定义控件与样式(13)-自定义窗体Window 自适应内容大小消息框MessageBox...
- 数学建模里面灵敏度分析怎么写