#107. 维护全序集

题目描述

这是一道模板题,其数据比「普通平衡树」更强。

如未特别说明,以下所有数据均为整数。

维护一个多重集 S SS ,初始为空,有以下几种操作:

  1. 把 x xx 加入 S SS
  2. 删除 S SS 中的一个 x xx,保证删除的 x xx 一定存在
  3. 求 S SS 中第 k kk 小
  4. 求 S SS 中有多少个元素小于 x xx
  5. 求 S SS 中小于 x xx 的最大数
  6. 求 S SS 中大于 x xx 的最小数

操作共 n nn 次。

输入格式

第一行一个整数 n nn,表示共有 n nn 次操作 。

接下来 n nn 行,每行为以下几种格式之一 :

  • 0 x,把 x xx 加入 S SS
  • 1 x,删除 S SS 中的一个 x xx,保证删除的数在 S SS 中一定存在
  • 2 k,求 S SS 中第 k kk 小的数,保证要求的数在 S SS 中一定存在
  • 3 x,求 S SS 中有多少个数小于 x xx
  • 4 x,求 S SS 中小于 x xx 的最大数,如果不存在,输出 −1 -1−1
  • 5 x,求 S SS 中大于 x xx 的最小数,如果不存在,输出 −1 -1−1

输出格式

对于每次询问,输出单独一行表示答案。

样例

样例输入

5
0 3
0 4
2 2
1 4
3 3

样例输出

4
0

数据范围与提示

1≤n≤3×105,0≤x≤109 1 \leq n \leq 3 \times 10 ^ 5, 0 \leq x \leq 10 ^ 91≤n≤3×10​5​​,0≤x≤10​9​​

#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0x7fffffff
#define maxn 400010
using namespace std;
int m,rt,son[maxn][],fa[maxn],val[maxn],cnt[maxn],sz[maxn],size;
void update(int x){
sz[x]=sz[son[x][]]+sz[son[x][]]+cnt[x];
}
void rotate(int x,int &k){
int y=fa[x],z=fa[fa[x]],l,r;
if(son[y][]==x)l=;else l=;r=l^;
if(y==k)k=x;
else son[z][son[z][]==y]=x;
fa[x]=z;fa[y]=x;fa[son[x][r]]=y;
son[y][l]=son[x][r];son[x][r]=y;
update(y);update(x);
}
void splay(int x,int &k){
while(x!=k){
int y=fa[x],z=fa[fa[x]];
if(y!=k){
if((son[z][]==y)^(son[y][]==x))rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
void Insert(int v){
int y=,k=rt;
while(k&&val[k]!=v)y=k,k=son[k][v>val[k]];
if(k)cnt[k]++;
else {
k=++size;
cnt[k]=sz[k]=;
fa[k]=y;val[k]=v;
if(y)son[y][v>val[y]]=k;
}
splay(k,rt);
}
int find2(int x){
x++;int k=rt;
if(sz[k]<x)return ;
while(){
if(sz[son[k][]]<x&&sz[son[k][]]+cnt[k]>=x)return k;
if(sz[son[k][]]>=x)k=son[k][];
else x-=sz[son[k][]]+cnt[k],k=son[k][];
}
return k;
}
void find1(int x){
int k=rt;if(!k)return;
while(son[k][x>val[k]]&&val[k]!=x)
k=son[k][x>val[k]];
splay(k,rt);
}
int nxt(int x,int f){
find1(x);//if(!rt)return 0;
if((val[rt]>x&&f)||(val[rt]<x&&!f))return rt;
int k=son[rt][f];
while(son[k][f^])k=son[k][f^];
return k;
}
void del(int v){
find1(v);
int x=rt,k;
if(cnt[rt]>){cnt[rt]--;sz[rt]--;return;}
if(son[rt][]*son[rt][]==){
rt=son[rt][]+son[rt][];
}
else {
k=son[rt][];
while(son[k][])k=son[k][];sz[k]+=sz[son[x][]];
fa[son[x][]]=k;
son[k][]=son[x][];rt=son[x][];
}
fa[rt]=;splay(k,rt);
}
void debug(){
printf("%d ",val[rt]); }
int main(){
scanf("%d",&m);
Insert(0x7fffffff);Insert(-0x7fffffff);
int op,x;
while(m--){
scanf("%d%d",&op,&x);
if(op==)Insert(x);
if(op==)del(x);
if(op==)printf("%d\n",val[find2(x)]);
if(op==){
find1(x);
int ans=sz[son[rt][]]-;
if(val[rt]<x)ans+=cnt[rt];
printf("%d\n",ans);
}
if(op==){
int w=val[nxt(x,)];
if(w==INF||w==-INF)puts("-1");
else printf("%d\n",w);
}
if(op==){
int w=val[nxt(x,)];
if(w==INF||w==-INF)puts("-1");
else printf("%d\n",w);
}
}
return ;
}

loj #107. 维护全序集的更多相关文章

  1. 2018.07.24 loj#107. 维护全序集(非旋treap)

    传送门 就是普通平衡树,可以拿来练非旋treap" role="presentation" style="position: relative;"&g ...

  2. LOJ#107. 维护全序集(FHQ Treap)

    题面 传送门 题解 板子,没啥好说的 //minamoto #include<bits/stdc++.h> #define R register #define inline __inli ...

  3. LibreOJ #107. 维护全序集

    内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 匿名   splay模板题 屠龙宝刀点击就送 #include <cstdio&g ...

  4. LOJ107. 维护全序集【树状数组维护全序集】

    题目描述 这是一道模板题,其数据比「普通平衡树」更强. 如未特别说明,以下所有数据均为整数. 维护一个多重集 S ,初始为空,有以下几种操作: 把 x 加入 S 删除 S 中的一个 x,保证删除的 x ...

  5. 【GXZ的原创】平衡树性能测试

    本文作者为 GXZlegend ,转载请注明 出处 ,谢谢! 〇.序言 前些日子闲的蛋疼做了个平衡树性能测试... 主要是因为学会的平衡树越来越多,做题时却不知道写哪个... 本想结合效率和代码复杂度 ...

  6. LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治

    题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...

  7. Loj 2230. 「BJOI2014」大融合 (LCT 维护子树信息)

    链接:https://loj.ac/problem/2230 思路: 设立siz数组保存虚点信息,sum表示总信息 维护子树信息link操作和access操作需要进行一些改动 可参考博客:https: ...

  8. LOJ #2769 -「ROI 2017 Day 1」前往大都会(单调栈维护斜率优化)

    LOJ 题面传送门 orz 斜率优化-- 模拟赛时被这题送走了,所以来写篇题解( 首先这个最短路的求法是 trivial 的,直接一遍 dijkstra 即可( 重点在于怎样求第二问.注意到这个第二问 ...

  9. LOJ 164 【清华集训2015】V——线段树维护历史最值

    题目:http://uoj.ac/problem/164 把操作改成形如 ( a,b ) 表示加上 a 之后对 b 取 max 的意思. 每个点维护当前的 a , b ,还有历史最大的 a , b 即 ...

随机推荐

  1. 完美解决HALCON C#编程目标平台冲突问题

    完美解决HALCON C#编程目标平台冲突问题   楼主# 更多发布于:2016-11-23 10:06     背景: 目标机器工控机使用11.0.1 32位Halcon 原因你懂的.开发环境Win ...

  2. OO设计基本原则

    OO本身就是一种大的设计模式,它是随着软件规模越来越大产生出来帮助人们建模和开发的理念,生来就带着封装.继承.多态等可复用基因.为了充分发挥这些基因的功效,使用者需要遵守一定的原则,就是所谓的面向对象 ...

  3. python动态爬取网页

    简介 有时候,我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现,我们要提取的网页元素并不在我们下载到的HTML之中,尽管它们在浏览器里看起来唾手可得. 这说明我们想要的元素是在我 ...

  4. Python基本数据类型--列表、元组、字典、集合

    一.Python基本数据类型--列表(List) 1.定义:[ ]内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素. 2.列表的创建: # 方式一 list1 = ['name','ag ...

  5. IIS设置Access-Control-Allow-Origin

    打开iis,找到“HTTP响应标头”点进去, 在右侧可以看到添加,然后添加如下标头即可Access-Control-Allow-Headers:Content-Type, api_key, Autho ...

  6. 主机不能访问虚拟机中的web服务【解决方案】

    百度了其它一些方法都不行,最后实在没辙,关了windows防火墙和Linux防火墙,居然能够访问了,我服. 总结一下,原来是Red Hat Linux 6.0防火墙没有开启端口80,开启的方法为(老版 ...

  7. 【bzoj1016】[JSOI2008]最小生成树计数

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4863  Solved: 1973[Submit][St ...

  8. 535. Encode and Decode TinyURL 长短URL

    [抄题]: TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problem ...

  9. 788. Rotated Digits 旋转数字

    [抄题]: X is a good number if after rotating each digit individually by 180 degrees, we get a valid nu ...

  10. convertTo

    转自 http://blog.csdn.net/xiaxiazls/article/details/51204265 在使用Opencv中,常常会出现读取一个图片内容后要把图片内容的像素信息转为浮点并 ...