内存限制:256 MiB 时间限制:1000 ms 标准输入输出
                            题目类型:传统 评测方式:文本比较
                                上传者: 匿名
 

splay模板题

屠龙宝刀点击就送

#include <cstdio>
typedef long long LL;
#define N 300500 LL data[N];
int siz[N],cnt[N],ch[N][],fa[N],root,cn,n;
inline int son(int x) {return ch[fa[x]][]==x;}
inline void pushup(int rt)
{
int l=ch[rt][],r=ch[rt][];
siz[rt]=cnt[rt]+siz[l]+siz[r];
}
inline void rotate(int x)
{
int y=fa[x],z=fa[y],b=son(x),c=son(y),a=ch[x][!b];
if(z) ch[z][c]=x;
else root=x;
fa[x]=z;
if(a) fa[a]=y;
ch[y][b]=a;
ch[x][!b]=y;
fa[y]=x;
pushup(y);
pushup(x);
}
void splay(int x,int i)
{
for(;fa[x]!=i;)
{
int y=fa[x],z=fa[y];
if(z==i) rotate(x);
else
{
if(son(x)==son(y))
{
rotate(y);
rotate(x);
}
else
{
rotate(x);
rotate(x);
}
}
}
}
void ins(int &rt,LL x)
{
if(!rt)
{
rt=++cn;
data[cn]=x;
siz[cn]=cnt[cn]=;
splay(cn,);
return;
}
if(data[rt]==x)
{
cnt[rt]++;
siz[rt]++;
splay(rt,);
return;
}
if(x<data[rt])
{
ins(ch[rt][],x);
fa[ch[rt][]]=rt;
pushup(rt);
}
else
{
ins(ch[rt][],x);
fa[ch[rt][]]=rt;
pushup(rt);
}
}
int getmn(int rt)
{
int p=rt,ans=-;
for(;p;p=ch[p][]) ans=p;
return ans;
}
void del(int rt,LL x)
{
if(data[rt]==x)
{
if(cnt[rt]>)
{
cnt[rt]--;
siz[rt]--;
}
else
{
splay(rt,);
int p=getmn(ch[rt][]);
if(p!=-)
{
splay(p,rt);
root=p;
fa[p]=;
ch[p][]=ch[rt][];
fa[ch[rt][]]=p;
}
else
{
root=ch[rt][];
fa[ch[rt][]]=;
}
}
return;
}
if(x<data[rt])
{
del(ch[rt][],x);
pushup(rt);
}
else
{
del(ch[rt][],x);
pushup(rt);
}
}
int getkth(int rt,int k)
{
int l=ch[rt][];
if(siz[l]+<=k&&k<=siz[l]+cnt[rt]) return rt;
if(siz[l]+>k) return getkth(ch[rt][],k);
else if(k>siz[l]+cnt[rt]) return getkth(ch[rt][],k-(siz[l]+cnt[rt]));
}
int get_suc(int rt,LL x)
{
int p=rt,ret=-;
for(;p;)
{
if(x>=data[p]) p=ch[p][];
else
{
ret=p;
p=ch[p][];
}
}
return ret;
}
int get_pre(int rt,LL x)
{
int p=rt,ret=-;
for(;p;)
{
if(x<=data[p]) p=ch[p][];
else
{
ret=p;
p=ch[p][];
}
}
return ret;
}
int get_pos(int rt,LL x)
{
if(data[rt]==x) return rt;
if(x<data[rt]) return get_pos(ch[rt][],x);
else return get_pos(ch[rt][],x);
}
int Main()
{
scanf("%d",&n);
for(LL opt,x,pos,flag;n--;)
{
scanf("%lld%lld",&opt,&x);
if(!opt) ins(root,x);
else if(opt==) del(root,x);
else if(opt==) printf("%lld\n",data[getkth(root,x)]);
else if(opt==) ins(root,x),pos=get_pos(root,x),splay(pos,),printf("%d\n",siz[ch[root][]]),del(root,x);
else if(opt==) pos=get_pre(root,x),pos==-?printf("-1\n"):printf("%lld\n",data[pos]);
else pos=get_suc(root,x),pos==-?printf("-1\n"):printf("%lld\n",data[pos]);
}
return ;
}
int sb=Main();
int main(int argc,char *argv[]) {;}

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

  1. loj #107. 维护全序集

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

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

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

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

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

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

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

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

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

  6. BSA基础数据维护

    平台 BSA基础数据维护 .扇区五个字段的内容 本来值为0,经过107上计算解析,得出正常的数值.然后106上报(200050),得到回复(200051). 查看回复数据,是否有错误.比如提示104 ...

  7. LibreOJ 题解汇总

    目录 #1. A + B Problem #2. Hello, World! #3. Copycat #4. Quine #7. Input Test #100. 矩阵乘法 #101. 最大流 #10 ...

  8. Oracle 11g 物理Dataguard日常操作维护(二)

    Oracle 11g 物理Dataguard日常操作维护(二) 2017年8月25日 14:34 3.3 3.3.1 查看备库进程状态 SYS(125_7)@fpyj123> select pr ...

  9. 102. Binary Tree Level Order Traversal + 103. Binary Tree Zigzag Level Order Traversal + 107. Binary Tree Level Order Traversal II + 637. Average of Levels in Binary Tree

    ▶ 有关将一棵二叉树转化为二位表的题目,一模一样的套路出了四道题 ▶ 第 102 题,简单的转化,[ 3, 9, 20, null, null, 15, 7 ] 转为 [ [ 15, 7 ] , [ ...

随机推荐

  1. MemoryStream转string

    MemoryStream rtfTx = new MemoryStream(); var bs = rtfTx.ToArray(); string s = Encoding.UTF8.GetStrin ...

  2. js学习笔记3:with语句的使用

    with语句 with是ECMAScript规定的内容,主要用于设置代码在特定对象中的作用域. var sMessage = "hello"; with(sMessage) { c ...

  3. matlab新手入门(一)(翻译)

    桌面基础知识 启动MATLAB®时,桌面将以其默认布局显示. 桌面包括以下面板: 当前文件夹 - 访问您的文件. 命令窗口 - 在命令行中输入命令,由提示符(>>)指示. 工作区 - 浏览 ...

  4. char和nchar,varchar和nvarchar的区别(转载)

    1)       定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不足的补英文半角空格 varchar:  可变长度, ...

  5. org.apache.commons.httpclient.HttpClient的使用(转)

    HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java net包中已经提供了访 ...

  6. python unittest模块

    import unittest import random class Operation(object): def __init__(self, num1=0, num2=0): if not (0 ...

  7. ThinkSNS+ 是如何计算字符显示长度的

    什么是ThinkSNS+ ThinkSNS(简称TS),一款全平台综合性社交系统,目前最新版本为ThinkSNS+.ThinkSNS V4 ThinkSNS[简]. 今天我们来聊一下可能很多人都会头疼 ...

  8. vue -- key的特殊作用

    v-for渲染的列表的结构采用“就地复用”的策略,也就说当数据重新排列数据时,会复用已在页面渲染好的元素,不会移动 DOM 元素来匹配数据项的顺序,这种模式是高效的,改变现有位置的结构的数据即可 eg ...

  9. Jmeter 跨线程组传递参数 之两种方法

    终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...

  10. 51nod1244 欧拉函数之和 杜教筛

    和上一题差不多,一个是μ*I=e,一个是φ*I=Id 稍改就得到了这题的代码 (我会告诉你我一开始逆元算错了吗) #include <bits/stdc++.h> #define MAX ...