BZOJ4184 shallot葱苗
Description
小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏。
每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且
让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大。
这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为Oi选手的你,你能帮帮他吗?
你只需要输出最大的异或和即可,若小葱手中没有小葱苗则输出0。
Input
第一行一个正整数n表示总时间;
第二行n个整数a1,a2...an,若ai大于0代表给了小葱一颗数字为ai的小葱苗,否则代表从小葱手中拿走一颗数字为-ai的小葱苗
Output
输出共n行,每行一个整数代表第i个时刻的最大异或和。
Sample Input
6
1 2 3 4 -2 -3
Sample Output
1
3
3
7
7
5
Hint
N<=500000,Ai<=2^31-1
这道题考个思路。
线性基不支持删除操作。
如果只有删除这个操作的话,我们不妨把它倒过来视为添加操作(注意,这个思想在很多题中都会用到),但是——
这是一道有添加和删除两个操作的题,我们可以离线来搞,于是又变成了区间xor最大值的模板题。
因为有内存限制,我们就只存数,用一个线性基来操作(时间是有序的)
#include<bits/stdc++.h>
using namespace std;
#define Inc(i,L,r) for(register int i=(L);i<=(r);++i)
#define Red(i,r,L) for(register int i=(r);i>=(L);--i)
const int N = 5e5+10;
struct Linear_Basis{int p[33];inline void insert(int k){Red(i,31,0){if(!(k>>i))continue;if(!p[i]){p[i]=k;break;}k^=p[i];}}inline int Max(){int ans=0;Red(i,31,0)if((ans^p[i])>ans)ans^=p[i];return ans;}
}LB;
struct Tree{int L,r;vector<int>vec;
}t[N<<2];
struct SegMent{#define Ls v<<1#define rs v<<1|1inline void build(int v,int L,int r){t[v]=(Tree){L,r};t[v].vec.clear();if(L==r)return ;int Mid=L+r>>1;build(Ls,L,Mid),build(rs,Mid+1,r);}inline void update(int v,int L,int r,int k){if(L>t[v].r||r<t[v].L)return ;if(L<=t[v].L&&t[v].r<=r)return t[v].vec.push_back(k),void();update(Ls,L,r,k),update(rs,L,r,k);}
}stm;
int n;
map<int,int>save;
map<int,int>::iterator it;
inline void init(){scanf("%d",&n);stm.build(1,1,n);Inc(i,1,n){int x;scanf("%d",&x);if(x>0)save[x]=i;else {stm.update(1,save[-x],i-1,-x);//在哪一段加入的 save.erase(-x);//删除下标(第一维) }}
}
inline void Query(int v,Linear_Basis xxj){for(int i=0;i<t[v].vec.size();++i)xxj.insert(t[v].vec[i]);if(t[v].L==t[v].r)return cout<<xxj.Max()<<"\n",void();Query(Ls,xxj),Query(rs,xxj);//考虑到是有序的,我们一次遍历所有区间,因为50w太大单个询问会t
}
inline void solv(){for(it=save.begin();it!=save.end();++it)stm.update(1,it->second,n,it->first);//因为已经去掉了被删除的,所以留下的数以后都能用 Query(1,LB);
}
int main(){init();solv();return 0;
}
BZOJ4184 shallot葱苗相关推荐
- []BZOJ4184: shallot
题解: 考虑离线 对于每个数都有一个存在时间段 我们以时间段建线段树 因为线性基不允许删除元素 然后我们只需要把对应时间段的元素加入 这样就能避免删除问题 然后就是普通操作了(第一次写链表版本的线性 ...
- BZOJ4184 shallot
标签:线性基,线段树,CDQ分治 题目 题目传送门 Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一 ...
- [BZOJ4184]shallot 线段树+线性基
链接 题意:给你每个数字出现的时间和消失的时间,求每个时刻最大异或和 题解 按照时间建立线段树,线段树每个节点开个vector存一下这个时间区间有哪些数,然后递归进入的时候加入线性基,开一个栈记录一下 ...
- 【BZOJ4184】Shallot(线性基,线段树分治)
Description 可支持插入.删除.求最大异或值的线性基. Solution 插入.求最大异或值都比较基础. 其实删除也是套路吧,,直接建一棵时间线段树即可. Code /*********** ...
- GO语言实现设计模式【全】
文章目录 0.前言 1.责任链模式 概念 示例 登机过程 测试程序 运行结果 2.命令模式 概念 示例 电饭煲接收器 电饭煲命令 测试程序 运行结果 3.迭代器模式 概念 示例 班级成员 运行结果 4 ...
- GO 语言实现设计模式【全】
文章目录 0.前言 1.责任链模式 概念 示例 登机过程 测试程序 运行结果 2.命令模式 概念 示例 电饭煲接收器 电饭煲命令 测试程序 运行结果 3.迭代器模式 概念 示例 班级成员 运行结果 4 ...
- conceptd什么时候上市_北方种植大葱,要在秋冬季节上市,什么时候播种、定植呢?...
北方种植大葱,要在秋冬季节上市,什么时候播种.定植呢? 大葱以食嫩叶和葱白为主,但在北方秋冬季上市的大葱,以葱白为主,葱白柔嫩洁白,质地细腻,可以生食,不过生食以北方朋友为主,南方的朋友很少吃的下去, ...
- 【转存】Go语言设计模式(推荐阅读)
文章目录 0.前言 1.责任链模式 概念 示例 登机过程 测试程序 运行结果 2.命令模式 概念 示例 电饭煲接收器 电饭煲命令 测试程序 运行结果 3.迭代器模式 概念 示例 班级成员 运行结果 4 ...
- 【BZOJ4184】shallot 线段树+vector+线性基
[BZOJ4184]shallot Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从 ...
最新文章
- Web Storage
- hdu5012 水搜索
- 判断Oracle中某个字段是否含有数字
- Linux的基本原则
- mysql统计各部门人数_2019年内蒙古普通高校招生考试各分数段人数统计表公布
- mybatis select语句会默认带排序吗_10月阿里最新38道Java面试题解析(MyBatis+消息队列+Redis)...
- 使用identity+jwt保护你的webapi(一)——identity基础配置
- Array提供的方法
- linux 出现 ,Linux出现SIGSTOP的原因及如何处理?
- 大数据之-Hadoop之HDFS的API操作_文件夹_以及文件删除案例---大数据之hadoop工作笔记0059
- Dart入门—库、泛型与异常
- python爬虫有道词典_Python爬取有道词典,有道的反爬很难吗?也就这样啊!
- 广州药业vs加多宝 王老吉
- 美国 android手机号码,格式编辑文本为美国电话号码1(xxx)-xxxx你输入android?
- 目前梦幻山东区人最多的服务器,梦幻西游十大火区盘点:有好朋友的区就是最火的区...
- March 22 2017 Week 12 Wednesday
- 前端工程师的 2018 年总结
- 微信qq邮箱提醒 服务器繁忙,微信设置密码失败,QQ无法绑定,邮箱服务器繁忙...
- 想做项目经理?这些工具必须了解
- Aras学习笔记 (7) Aras Innovator Method集成Visual Studio