//splay模版
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; #define MAX 500100
int root=,N,tot=; inline int read()
{
register int x=,t=;
register char ch=getchar();
while((ch<''||ch>'')&&ch!='-')ch=getchar();
if(ch=='-'){t=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-;ch=getchar();}
return x*t;
} struct Node
{
int ch[];//子节点
int ff;//父节点
int cnt;//数量
int val;//值
int son;//儿子数量
}t[MAX]; void push_up(int u)//计算儿子数
{
t[u].son=t[t[u].ch[]].son+t[t[u].ch[]].son+t[u].cnt;
} void rotate(int x)//旋转
{
register int y=t[x].ff;
register int z=t[y].ff;
register int k=t[y].ch[]==x;//x是y的左或右儿子
t[z].ch[t[z].ch[]==y]=x; t[x].ff=z;
t[y].ch[k]=t[x].ch[k^]; t[t[x].ch[k^]].ff=y;
t[x].ch[k^]=y; t[y].ff=x;
push_up(y);push_up(x);
} void Splay(int x,int goal)//把x节点旋转到目标位置
{
while(t[x].ff!=goal)
{
int y=t[x].ff;
int z=t[y].ff;
if(z!=goal)//旋转
(t[y].ch[]==x)^(t[z].ch[]==y)?rotate(x):rotate(y);
rotate(x);
}
if(goal==)
root=x;//当前的根节点
} void insert(int x)//插入x
{
int u=root,ff=;
while(u&&t[u].val!=x)
{
ff=u;
u=t[u].ch[x>t[u].val];
}
if(u)//已经有这个数字了
t[u].cnt++;//计算数字个数
else//不存在这个数字,加入新的节点
{
u=++tot;//总的节点数
if(ff)
t[ff].ch[x>t[ff].val]=u;
t[tot].ch[]=;
t[tot].ch[]=;
t[tot].ff=ff; t[tot].val=x;
t[tot].cnt=; t[tot].son=;
}
Splay(u,);
} void Find(int x)//查找x的位置
{
int u=root;
if(!u)return;//不存在节点,无法查找排名
while(t[u].ch[x>t[u].val]&&x!=t[u].val)//找到x所在的位置
u=t[u].ch[x>t[u].val];
Splay(u,); } int Next(int x,int f)//查找前驱/后继
{
Find(x);//查找x的位置(Splay操作到根节点)
int u=root;
if((t[u].val>x&&f)||(t[u].val<x&&!f))return u;//返回结果
u=t[u].ch[f];
while(t[u].ch[f^])u=t[u].ch[f^];
return u;
} void Delete(int x)//删除x
{
int last=Next(x,);//查找前驱
int next=Next(x,);//查找后继
Splay(last,);Splay(next,last);
int del=t[next].ch[];
if(t[del].cnt>)
{
t[del].cnt--;//存在多个这个数字,直接减去一个
Splay(del,);
}
else
t[next].ch[]=;//清除掉节点
} int K_th(int x)//查找排名为x的值
{
int u=root;
if(t[u].son<x)//不存在这么多个数
return false;
while()
{
int y=t[u].ch[];
if(x>t[y].son+t[u].cnt)//在排名在u的后面
{
x-=t[y].son+t[u].cnt;//直接减掉这么多
u=t[u].ch[];//在右子树中继续找
}
else
if(t[y].son>=x)//如果y的节点数多于x
u=y; //在左子树中继续查找
else
return t[u].val;//否则找到了结果,直接返回
}
}
int main()
{
insert(-);
insert(+);
N=read();
while(N--)
{
int opt=read();
if(opt==)
insert(read());
else
if(opt==)
Delete(read());
else
if(opt==)
{
Find(read());
printf("%d\n",t[t[root].ch[]].son);
}
else
if(opt==)
printf("%d\n",K_th(read()+));
else
if(opt==)
printf("%d\n",t[Next(read(),)].val);
else
if(opt==)
printf("%d\n",t[Next(read(),)].val);
}
return ;
}

splay模版的更多相关文章

  1. [Splay模版1]

    输入 第1行:1个正整数n,表示操作数量,100≤n≤200,000 第2..n+1行:可能包含下面3种规则: 1个字母'I',紧接着1个数字k,表示插入一个数字k到树中,1≤k≤1,000,000, ...

  2. [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)

    Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或 ...

  3. _bzoj3224 Tyvj 1728 普通平衡树【Splay】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3224 保存splay模版 一刻不停写了一个小时多一点,幸好一遍过了!(其实带着freopen ...

  4. tyvj 1729 文艺平衡树

    文艺平衡树 From admin 背景 Background 此为平衡树系列第二道:文艺平衡树 描述 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以 ...

  5. bzoj3223 文艺平衡树 codevs3303 翻转区间

    splay模版题吧 只有区间翻转 至于为什么要把须翻转区间旋到根 因为查找一个区间可以先找出他左端点左边第一个点和右端点x右边第一个点y 然后将x旋到根节点 y旋到x的右儿子 这样x的右边的点就是所有 ...

  6. ZJOI2006书架

    追yql做题记录的时候做到的……一道Splay模版题…… 啊LCT写久了都有点忘了Splay了(什么奇怪的逻辑?) 其实说白了五个操作: 1. 将某元素置顶:将元素旋到根,然后将左子树合并到该元素的后 ...

  7. 1439. Battle with You-Know-Who(splay树)

    1439 路漫漫其修远兮~ 手抄一枚splay树 长长的模版.. 关于spaly树的讲解   网上很多随手贴一篇 貌似这题可以用什么bst啦 堆啦 平衡树啦 等等 这些本质都是有共同点的 查找.删除特 ...

  8. BZOJ3224普通平衡树【Splay】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 11751  Solved: 5013 Descriptio ...

  9. Luogu1486郁闷的出纳员【Splay】

    P1486 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...

随机推荐

  1. java中传参的要点

    传参的是分为:值传递和引用传递,值传递不会改变值,传递的是这个值的副本(就是把这个值拿出来拷贝一份用拷贝的值):引用传递会改变值,传递的是这个值的“地址”: String是特殊的引用类型,用Strin ...

  2. org-mode记录总结

    org-mode记录总结 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} cod ...

  3. 使用IO流将数据库中数据生成一个文件,结果使用Notepad++打开部分数据结尾出现NUL

    场景描述: 项目中通过java代码中从数据库中查询一系列数据,对数据做相应处理,然后通过字符流将数据写如一个新生成的文件中,将该项目部署在linux服务器上,最后生成的文件拿到本地使用notepad+ ...

  4. aiohttp上报405: Method Not Allowed

    请求方式不对,修改为“POST”或者“GET” 可参考:https://blog.csdn.net/yiifaa/article/details/80928487

  5. 解决虚拟机克隆的linux系统ip无法正常使用问题

    当我们克隆centos虚拟机无法正常获取IP地址,重启网卡也提示Bringing up interface eth0:  Device eth0 does not seem to be present ...

  6. Codeforces Round #552:G. Minimum Possible LCM

    官方题解是时间复杂度为O(nd)的.这里给出一个简单实现但是时间复杂度为O(NlogN) (N=1e7) 因为 a*b/gcd(a,b)=lcm(a,b) 所以我们可以枚举每一个因子,然后找到存在这个 ...

  7. 2019南昌邀请赛预选赛 I. Max answer (前缀和+单调栈)

    题目:https://nanti.jisuanke.com/t/38228 这题题解参考网上大佬的. 程序的L[i],R[i]代表a[i]这个点的值在区间 [L[i],R[i]] 中最小的并且能拓展到 ...

  8. javascript笔记 (持续更新)

    1. 语言主要分为两大类:编译型语言和解释型语言. 对于静态语言来说(如Java.C++.C),处理上述这些事情的叫编译器(Compiler),相应地对于JavaScript这样的动态语言则叫解释器( ...

  9. 关系型数据库---MYSQL---系统学习

    1.概述 1.1 mysql数据库是一种  客户端/服务器体系  的 数据库系统: 服务器部分 在启动运行后没有人机界面,所以终端用户  无法直接使用MySQL: 对MySQL数据库进行访问.操作  ...

  10. 【JavaWeb项目】一个众筹网站的开发(八)后台页面详细设置

    一.user.jsp改造 删除引入菜单 抽取导航栏 nav-bar.jsp,删除引入导航栏 删除引入main.jsp的到好烂 数据库里添加url 报错,url不对 没有/ url正确 action=& ...