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

10 11
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树_权值线段树的更多相关文章

  1. 3065: 带插入区间K小值_树套树_替罪羊树_权值线段树

    经过周六一天,周一3个小时的晚自习,周二2个小时的疯狂debug,终于凭借自己切掉了这道树套树题. Code: #include <cstdio> #include <algorit ...

  2. BZOJ_2161_布娃娃_权值线段树

    BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...

  3. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

  4. BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树

    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...

  5. 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树

    题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...

  6. 主席树 【权值线段树】 && 例题K-th Number POJ - 2104

    一.主席树与权值线段树区别 主席树是由许多权值线段树构成,单独的权值线段树只能解决寻找整个区间第k大/小值问题(什么叫整个区间,比如你对区间[1,8]建立一颗对应权值线段树,那么你不能询问区间[2,5 ...

  7. [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并

    永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...

  8. [jdoj1258]野生动物园(change by panxf)_权值线段树_组合数

    人品计算 题目大意:n个数的a序列,m组询问.每次询问给出T,A,B,K.求在a序列的[A,B]的位置之内的K小值P,的$C_{T}^{P \% T} \% 10111$. 注释:每组询问保证区间只相 ...

  9. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

随机推荐

  1. 阅读源码(IV)

    往期系列: <由阅读源码想到> <由阅读源码想到 | 下篇> <阅读源码(III)> Eric S.Raymond的写于2014年的<How to learn ...

  2. Java + Selenium + TestNG + Maven

    环境准备: 1. Java: Install Java jdk: Version: java 1.8 or aboveConfigure Java Environment Variables:Add ...

  3. Jquery getJSON方法分析

    准备工作 ·Customer类 public class Customer {     public int Unid { get; set; }     public string Customer ...

  4. 使用Owin的WebApi,并分离Controllers

    1.新建空白web项目 2.添加新建项=>OWIN Startup类(此时会自动下载owin,放在Packages里) 3.在Startup中输入 public void Configurati ...

  5. POP3和imap

    POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110).本协议主要用于支持使用客户端远程管理在服务器上的电子邮 ...

  6. 实例解析Collections源码,Iterator和ListIterator

    比如一个视频或文章有多个页面标签设置,我们在看一篇文章或一个视频时,底部有为你推荐栏目. 如何根据这个文章或视频的标签,来实现这个推荐栏目呢. public List<VideoInfoVo&g ...

  7. 关于JQuery Class选择器的一点

    当某个元素的Class为为两个字符串的时候,那用class选择器的时候就必须把两个字符串都写上否则无效 <div class="cla clb">11111<di ...

  8. 《Servlet与JSP核心编程》读书笔记

    这本书实际是我进入JavaWeb开发的入门书籍,而且是日常碰到一些技术问题需要确认时的参考书,前一段时间在解决一个他人的问题时,我突然发现我的第一遍阅读对这本书的内容的理解还不够透彻,所以又开始N多年 ...

  9. Bagging与方差

    在集成学习中,通常认为Bagging的主要作用是降低方差,而Boosting的主要作用是降低偏差.Boosting能降低偏差很好理解,因为其原理就是将多个弱学习器组合成强学习器.但Bagging为什么 ...

  10. Http协议、Tomcat、servlet

    HTTP协议 Http,超文本传输协议是互联网上最广泛的一种网络协议,所有的www文件都必须遵守这个标准. Http协议由http请求和http响应组成 http请求: 1.请求行 请求方式 POST ...