BZOJ_3685_普通van Emde Boas树_权值线段树
BZOJ_3685_普通van Emde Boas树_权值线段树
Description
设计数据结构支持:
1 x 若x不存在,插入x
2 x 若x存在,删除x
3 输出当前最小值,若不存在输出-1
4 输出当前最大值,若不存在输出-1
5 x 输出x的前驱,若不存在输出-1
6 x 输出x的后继,若不存在输出-1
7 x 若x存在,输出1,否则输出-1
Input
第一行给出n,m 表示出现数的范围和操作个数
接下来m行给出操作
n<=10^6,m<=2*10^6,0<=x<n
Output
Sample Input
1 1
1 2
1 3
7 1
7 4
2 1
3
2 3
4
5 3
6 2
Sample Output
1
-1
2
2
2
-1
权值线段树写的,感觉不是很慢。
唯一需要注意的是56操作时给出的x可能小于最小值/最大值,这时需要输出-1。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1000050
#define ls p<<1
#define rs p<<1|1
#define maxn (n-1)
inline char nc() {
static char buf[100000],*p1,*p2;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int rd() {
register int x=0; register char s=nc();
while(s<'0'||s>'9') s=nc();
while(s>='0'&&s<='9') x=(x<<3)+(x<<1)+s-'0',s=nc();
return x;
}
int t[N<<2],n,m,now;
void insert(int l,int r,int x,int v,int p) {
if(l==r) {
if(v==0) {
if(t[p]==0) now++;
t[p]=1;
}else {
if(t[p]==1) now--;
t[p]=0;
}
return ;
}
int mid=(l+r)>>1;
if(x<=mid) insert(l,mid,x,v,ls);
else insert(mid+1,r,x,v,rs);
t[p]=t[ls]+t[rs];
}
int get_rank(int l,int r,int x,int p) {
if(l==r) return 1;
int mid=(l+r)>>1;
if(x<=mid) return get_rank(l,mid,x,ls);
else return get_rank(mid+1,r,x,rs)+t[ls];
}
int get_x(int l,int r,int k,int p) {
if(l==r) return l;
int mid=(l+r)>>1;
if(k<=t[ls]) return get_x(l,mid,k,ls);
else return get_x(mid+1,r,k-t[ls],rs);
}
int calcmin(int l,int r,int p) {
if(l==r) return l;
int mid=(l+r)>>1;
if(t[ls]) return calcmin(l,mid,ls);
else return calcmin(mid+1,r,rs);
}
int calcmax(int l,int r,int p) {
if(l==r) return l;
int mid=(l+r)>>1;
if(t[rs]) return calcmax(mid+1,r,rs);
else return calcmax(l,mid,ls);
}
int exist(int l,int r,int x,int p) {
if(l==r) return t[p]?1:-1;
int mid=(l+r)>>1;
if(x<=mid) return exist(l,mid,x,ls);
else return exist(mid+1,r,x,rs);
}
int main() {
n=rd(); m=rd();
int i,x,opt;
for(i=1;i<=m;i++) {
opt=rd();
if(opt!=3&&opt!=4) x=rd();
if(opt==1) {
insert(0,maxn,x,0,1);
}else if(opt==2) {
insert(0,maxn,x,1,1);
}else if(opt==3) {
printf("%d\n",now?calcmin(0,maxn,1):-1);
}else if(opt==4) {
printf("%d\n",now?calcmax(0,maxn,1):-1);
}else if(opt==5) {
if(x<=calcmin(0,maxn,1)) puts("-1");
else {
int k=get_rank(0,maxn,x,1)-1;
printf("%d\n",get_x(0,maxn,k,1));
}
}else if(opt==6) {
if(x>=calcmax(0,maxn,1)) puts("-1");
else {
int k=get_rank(0,maxn,x+1,1);
printf("%d\n",get_x(0,maxn,k,1));
}
}else {
printf("%d\n",exist(0,maxn,x,1));
}
}
}
BZOJ_3685_普通van Emde Boas树_权值线段树的更多相关文章
- 3065: 带插入区间K小值_树套树_替罪羊树_权值线段树
经过周六一天,周一3个小时的晚自习,周二2个小时的疯狂debug,终于凭借自己切掉了这道树套树题. Code: #include <cstdio> #include <algorit ...
- BZOJ_2161_布娃娃_权值线段树
BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
- BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树
BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...
- 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树
题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...
- 主席树 【权值线段树】 && 例题K-th Number POJ - 2104
一.主席树与权值线段树区别 主席树是由许多权值线段树构成,单独的权值线段树只能解决寻找整个区间第k大/小值问题(什么叫整个区间,比如你对区间[1,8]建立一颗对应权值线段树,那么你不能询问区间[2,5 ...
- [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并
永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...
- [jdoj1258]野生动物园(change by panxf)_权值线段树_组合数
人品计算 题目大意:n个数的a序列,m组询问.每次询问给出T,A,B,K.求在a序列的[A,B]的位置之内的K小值P,的$C_{T}^{P \% T} \% 10111$. 注释:每组询问保证区间只相 ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
随机推荐
- 阅读源码(IV)
往期系列: <由阅读源码想到> <由阅读源码想到 | 下篇> <阅读源码(III)> Eric S.Raymond的写于2014年的<How to learn ...
- Java + Selenium + TestNG + Maven
环境准备: 1. Java: Install Java jdk: Version: java 1.8 or aboveConfigure Java Environment Variables:Add ...
- Jquery getJSON方法分析
准备工作 ·Customer类 public class Customer { public int Unid { get; set; } public string Customer ...
- 使用Owin的WebApi,并分离Controllers
1.新建空白web项目 2.添加新建项=>OWIN Startup类(此时会自动下载owin,放在Packages里) 3.在Startup中输入 public void Configurati ...
- POP3和imap
POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110).本协议主要用于支持使用客户端远程管理在服务器上的电子邮 ...
- 实例解析Collections源码,Iterator和ListIterator
比如一个视频或文章有多个页面标签设置,我们在看一篇文章或一个视频时,底部有为你推荐栏目. 如何根据这个文章或视频的标签,来实现这个推荐栏目呢. public List<VideoInfoVo&g ...
- 关于JQuery Class选择器的一点
当某个元素的Class为为两个字符串的时候,那用class选择器的时候就必须把两个字符串都写上否则无效 <div class="cla clb">11111<di ...
- 《Servlet与JSP核心编程》读书笔记
这本书实际是我进入JavaWeb开发的入门书籍,而且是日常碰到一些技术问题需要确认时的参考书,前一段时间在解决一个他人的问题时,我突然发现我的第一遍阅读对这本书的内容的理解还不够透彻,所以又开始N多年 ...
- Bagging与方差
在集成学习中,通常认为Bagging的主要作用是降低方差,而Boosting的主要作用是降低偏差.Boosting能降低偏差很好理解,因为其原理就是将多个弱学习器组合成强学习器.但Bagging为什么 ...
- Http协议、Tomcat、servlet
HTTP协议 Http,超文本传输协议是互联网上最广泛的一种网络协议,所有的www文件都必须遵守这个标准. Http协议由http请求和http响应组成 http请求: 1.请求行 请求方式 POST ...