BZOJ 4184 shallot 线性基+分治
Description
小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏。
每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大。这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为Oi选手的你,你能帮帮他吗?
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
—————————————————————————————————————————————————————
题意概述:
维护一个可重集合,进行N次操作,每次向集合中插入一个数字或者从集合中删除一个数字,并回答当前集合中的数字能够形成的最大亦或和。
分析:
线性基只能插入不能删除,所以我们只能把删除的影响处理掉,即不删除来搞事情。
可以发现一个数字在一个时间区间内出现,把每个数字的出现和消失当成一个事件。对于一个时间区间,区间右端点的答案只会被在这个区间中开始但是还没有结束的事件或者开始和结束横跨这个区间的操作所影响。
于是可以采用分治的方法,对于当前区间,横跨整个区间的操作显然对这个区间的子区间也会有影响,直接修改。否则:事件在左半边的时候丢给左半边递归处理,事件在右半边的时候丢给右半边递归处理,事件跨越分界线的时候分成两个事件分别丢给左右区间。
因为是模拟线段树的分法,所以一个区间至多被分成logn个区间,空间显然也是可以承受的。
%%%PoPoQQQ大爷ORZ
时间复杂度O(NlogNloga)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
using namespace std;
const int maxn=; int N,ans[maxn];
struct data{ int l,r,v; };
map<int,int>C,lp;
map<int,int>::iterator it;
struct Linear_Base{
static const int up=;
int b[up];
Linear_Base(){ memset(b,,sizeof(b)); }
void ins(int x){
for(int i=up-;i>=;i--) if((<<i)&x){
if(!b[i]) { b[i]=x; break; }
else x^=b[i];
}
}
int query(){
int re=;
for(int i=up-;i>=;i--)
re=max(re,re^b[i]);
return re;
}
}Lb; void solve(int L,int R,vector<data>a,Linear_Base bl)
{
int m=L+R>>,n=a.size();
vector<data>l,r;
for(int i=;i<n;i++){
if(a[i].l==L&&a[i].r==R) bl.ins(a[i].v);
else if(a[i].r<=m) l.push_back(a[i]);
else if(a[i].l>m) r.push_back(a[i]);
else{
l.push_back((data){a[i].l,m,a[i].v});
r.push_back((data){m+,a[i].r,a[i].v});
}
}
if(L==R){ ans[L]=bl.query(); return; }
solve(L,m,l,bl);
solve(m+,R,r,bl);
}
void work()
{
scanf("%d",&N);
vector<data>a;
int x;
for(int i=;i<=N;i++){
scanf("%d",&x);
if(x<&&--C[-x]==) a.push_back((data){lp[-x],i-,-x}),C.erase(-x),lp.erase(-x);
else if(x>&&++C[x]==) lp[x]=i;
}
for(it=C.begin();it!=C.end();it++)
a.push_back((data){lp[it->first],N,it->first});
C.clear(); lp.clear();
solve(,N,a,Lb);
for(int i=;i<=N;i++) printf("%d\n",ans[i]);
}
int main()
{
work();
return ;
}
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 复原就 ...
- bzoj 4184: shallot (线段树维护线性基)
题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...
- bzoj 4184 shallot 时间线建线段树+vector+线性基
题目大意 n个时间点 每个时间点可以插入一个权值或删除一个权值 求每个时间点结束后异或最大值 分析 异或最大值用线性基 但是线性基并不支持删除操作 我们可以对时间线建一棵线段树 离线搞出每个权值出现的 ...
- BZOJ 4184: shallot
Description 在某时刻加入或删除一个点,问每个时刻的集合中能异或出来的最大值是多少. Sol 线段树+按时间分治+线性基. 按时间分治可以用 \(logn\) 的时间来换取不进行删除的操作. ...
- BZOJ.3811.玛里苟斯(线性基)
BZOJ UOJ 感觉网上大部分题解对我这种数学基础差的人来说十分不友好...(虽然理解后也觉得没有那么难) 结合两篇写的比较好的详细写一写.如果有错要指出啊QAQ https://blog.csdn ...
- bzoj 2115 Xor - 线性基 - 贪心
题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 问点$1$到点$n$的最大异或路径. 因为重复走一条边后,它的贡献会被消去.所以这条路径中有贡献的边可以看成是一条$1$到 ...
- 【BZOJ4184】shallot 线性基
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 此题如果我们不考虑删除元素这一个操作,那么就是一道裸的线性基题. 但是此题会删除 ...
- 「bzoj 4184: shallot」
权限题 线段树分治加线性基 首先这个题要求删除线性基肯定是没法处理的 于是我们套上一个线段树分治 线段树分治就是一种能够避免删除的神仙操作 我们发现询问是对一个时间的单点询问,而每一个数存在的时间却是 ...
随机推荐
- o'Reill的SVG精髓(第二版)学习笔记——第五章
第五章 文档结构 5.1 结构与表现 XML的目标之一便是提供一种能将结构从视觉表示中独立出来的方法. 但是不幸的是,关于XML的很多讨论都强调结构而非表现. 我们将通过详细讨论如何在SVG中指定表现 ...
- Vue nodejs商城项目-商品列表价格过滤和加入购物车功能
一.价格过滤功能 GoodsList.vue >>点击价格区间时发送请求 methods:{ getGoodsList(flag){ var param = { ...
- Unity 游戏框架搭建 (十五) 优雅的QChain (零)
加班加了三个月终于喘了口气,博客很久没有更新了,这段期间框架加了很多Feature,大部分不太稳定,这些Feature中实现起来比较简单而且用的比较稳定的就是链式编程支持了. 什么是链式编程? 我想大 ...
- Oracle udev 绑定磁盘(转)
scsi_id命令发出一个SCSI INQUIRY指令给设备,访问vital product data (VPD)页0x83的数据,那里包含设备的WWID和其他的信息,或者页0x80的数据,那里包含单 ...
- Oracle 用户、授权、角色管理
Oracle 用户管理 一.创建用户的Profile文件SQL> create profile student limit // student为资源文件名FAILED_LOGIN_ATTEMP ...
- CDN初识
CDN 全称:Content Delivery Network或Content Ddistribute Network,即内容分发网络,通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层 ...
- 使用Python第三方库生成二维码
本文主要介绍两个可用于生成二维码的Python第三方库:MyQR和qrcode. MyQR的使用: 安装: pip install MyQR 导入: from MyQR import myqr imp ...
- Java学习笔记六:Java的流程控制语句之if语句
Java的流程控制语句之if语句 一:Java条件语句之if: 我们经常需要先做判断,然后才决定是否要做某件事情.例如,如果考试成绩大于 90 分,则奖励一朵小红花 .对于这种“需要先判断条件,条件满 ...
- uva 253 - Cube painting(相同骰子)
习题4-4 骰子涂色(Cube painting, UVa 253) 输入两个骰子,判断二者是否等价.每个骰子用6个字母表示,如图4-7所示. 图4-7 骰子涂色 例如rbgggr和rggbgr分别表 ...
- CentOS(Linux)安装KETTLE教程 并配置执行定时任务
1,首先是安装jdk,并设置环境变量 采用yum安装可不设置环境变量 2,下载kettle https://sourceforge.net/projects/pentaho/files/Data%20 ...