题目大意

n个时间点
每个时间点可以插入一个权值或删除一个权值
求每个时间点结束后异或最大值

分析

异或最大值用线性基
但是线性基并不支持删除操作
我们可以对时间线建一棵线段树
离线搞出每个权值出现的区间
cover一下
先用vector存起来
最后每个时间点有的权值,就是线段树上
该叶子节点的所有祖先的权值
DFS一下动态维护一个只用插入的线性基就好了

注意

考虑如果手上有两个A权值,删除一个时怎么处理
开多一个num存数量,fir存权值最早出现位置
于是数据貌似并没有这种情况?。。。

solution

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
const int M=500007;
const int Bit=30;inline int rd(){int x=0;bool f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=0;for(;isdigit(c);c=getchar()) x=x*10+c-48;return f?x:-x;
}int n;
int a[M],val[M],tt;
int ty[M];
int fir[M],num[M];
int ans[M];struct Base{int v[Bit+1];Base(){memset(v,0,sizeof(v));}int getmx(){int res=0;for(int i=Bit;i>=0;i--) if(v[i]) res^=v[i];return res;}
};Base operator +(Base x,int y){int i,ps=-1;for(i=Bit;i>=0;i--)if(y>>i&1){if(x.v[i]==0 && ps==-1) ps=i;else y^=x.v[i];}if(~ps){x.v[ps]=y;for(i=Bit;i>ps;i--)if(x.v[i]>>ps&1) x.v[i]^=y;}return x;
}struct pai{int d,id;pai(int dd=0,int ii=0){d=dd;id=ii;}
}pp[M];bool cmp(pai x,pai y){return x.d<y.d;
}vector<int>hd[M<<2];void ins(int x,int l,int r,int tl,int tr,int d){if(tl<=l&&r<=tr){hd[x].push_back(d);return;}int mid=l+r>>1;if(tl<=mid) ins(x<<1,l,mid,tl,tr,d);if(mid<tr) ins(x<<1|1,mid+1,r,tl,tr,d);
}void DFS(int x,int l,int r,Base nw){int i;for(i=1;i<=hd[x].size();i++) nw=nw+hd[x][i-1];if(l==r){ans[l]=nw.getmx();return ;}int mid=l+r>>1;DFS(x<<1,l,mid,nw);DFS(x<<1|1,mid+1,r,nw);
}int main(){int i,x;n=rd();for(i=1;i<=n;i++){x=rd();ty[i]=x>0;x=abs(x);pp[i]=pai(x,i);}sort(pp+1,pp+n+1,cmp);pp[0].d=pp[1].d-1;for(i=1;i<=n;i++){if(pp[i].d!=pp[i-1].d) val[++tt]=pp[i].d;a[pp[i].id]=tt;}for(i=1;i<=n;i++){if(ty[i]==1){if(num[a[i]]==0) fir[a[i]]=i;num[a[i]]++;}else{if(num[a[i]]>0) ins(1,1,n, fir[a[i]],i-1, val[a[i]]);num[a[i]]--;}}for(i=1;i<=tt;i++)if(num[i]) ins(1,1,n, fir[i],n, val[i]);Base nw;DFS(1,1,n,nw);for(i=1;i<=n;i++) printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/acha/p/6418490.html

bzoj 4184 shallot 时间线建线段树+vector+线性基相关推荐

  1. 【BZOJ4184】shallot 线段树+vector+线性基

    [BZOJ4184]shallot Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从 ...

  2. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  3. 2017 ICPC西安区域赛 A - XOR ,线段树合并线性基

    题目链接:A - XOR 题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值 题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后 ...

  4. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  5. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  6. 2017年ICPC西安邀请赛A、XOR(线段树套线性基 + 思维)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目传送门 Problem 给你 nnn 和 nnn 个整数的数组 aaa,以及kkk和qqq,有 q ...

  7. 2017 ICPC西安区域赛 A - XOR (线段树并线性基)

    链接:https://nanti.jisuanke.com/t/A1607 题面: Consider an array AA with n elements . Each of its element ...

  8. P3292 [SCOI2016]幸运数字(树剖 + 线段树维护线性基)

    P3292 [SCOI2016]幸运数字 思路 如果这题是求x,yx, yx,y之间的距离显然我们可以通过树剖加线段树来写, 但是这里变成了求任意个数的异或最大值.如果给定区间我们显然可以通过线性基来 ...

  9. UVALive - 8512——线段树维护线性基

    [题目描述] UVALive - 8512XOR [题目分析] 这种区间+线性基的问题我们可以考虑用线段树维护,线性基的合并的话就直接暴力合并 找到所在区间的线性基后再查找最大的数,我看网上的博客要说 ...

最新文章

  1. 什么是java多线程_什么是java多线程,java多线程的基本原理?
  2. [BZOJ2144]国家集训队 跳跳棋
  3. mysql 郝朝阳_秒级故障切换!用MHA轻松实现MySQL高可用(三)
  4. 听webcast的行为型模式篇-迭代器模式(Iterator Pattern) 记录
  5. 计算机仿真作业三,计算机仿真技术作业三.doc
  6. 按键改变元素背景颜色 链式编程的原理 评分案例 each方法的使用
  7. 你懂change buffer吗
  8. [css] 用css3画出一个立体魔方
  9. CentOS查看分区的方式
  10. Qt之QFileSystemWatcher
  11. 请检查captcha表格_【分享】工程资料这样写,再也不用担心检查组来检查资料了...
  12. Linux各类压宿包的压缩和解压方法
  13. 「13」朴素贝叶斯Python实战:计算打喷嚏的工人患上新冠肺炎的概率
  14. 判断客户端是手机端还是PC端
  15. 计算机开机配置失败6,win7开机配置windows update失败怎么跳过?-win7配置update失败,安全模式还是配置失败...
  16. Android Verified Boot 2.0简要
  17. 学渣笔记——Java常用基本数据类型
  18. 某音热门---图片转字符SpringBoot版
  19. 日本互联网的十大知名巨头!你听说过几个?
  20. IPv6 内网穿透(一)

热门文章

  1. RTX5 | 线程管理05 - 线程挂起osThreadSuspend与线程恢复osThreadResume
  2. h5 表单居中_3分钟学会易企秀H5操作(基础篇)
  3. CSS3 linear-gradient实现三角形
  4. springmvc登录拦截器访问报错 SyntaxError: expected expression, got ''
  5. 在html标签中写三元运算符,如何在剃须刀中使用三元运算符(特别是在HTML属性上)?...
  6. Linux工作笔记-根据PID查询进程是否存在(进程管理相关程序中常用)
  7. Oracle笔记-Oracle基本结构及安装启动(windows版)
  8. Qt文档阅读笔记-QSslSocket中与错误相关的信号
  9. C++静态联编与动态联编
  10. linux java version 版本不对,linux JAVA_HOME和 java -version不匹配