P3369 【模板】普通平衡树

就是不用treap

splay板子,好好背吧TAT

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 100005
int n,cnt,rt,ans,q1,q2;
struct data{int v,ch[],fa,siz;}a[];
#define lc a[o].ch[0]
#define rc a[o].ch[1]
void up(int o){a[o].siz=a[lc].siz+a[rc].siz+;}
void turn(int x,int &k){
int y=a[x].fa,z=a[y].fa;
int l=(a[y].ch[]==x),r=l^;
if(y==k) k=x;
else a[z].ch[a[z].ch[]==y]=x;
a[a[x].ch[r]].fa=y; a[x].fa=z; a[y].fa=x;
a[y].ch[l]=a[x].ch[r]; a[x].ch[r]=y;
up(y); up(x);
}
void splay(int x,int &k){
for(;x!=k;turn(x,k)){
int y=a[x].fa,z=a[y].fa;
if(y!=k) turn(((a[y].ch[]==x)^(a[z].ch[]==y))?x:y,k);
}
}
int find(int o,int k){//查找排名为k的点的位置
while(k!=a[lc].siz+){
if(a[lc].siz+>=k) o=lc;
else k=k-a[lc].siz-,o=rc;
}return o;
}
int torank(int o,int k){//排名查询
int re=,id=;
while(o){
if(a[o].v==k) id=o;
if(a[o].v>=k) o=lc;
else re+=a[lc].siz+,o=rc;
}
if(id) splay(id,rt);//保证复杂度
return re;
}
void ins(int k){//添加
int o=rt,Fa=;
while(o) Fa=o,o=a[o].ch[a[o].v<=k];
o=++cnt; a[o].v=k; a[o].fa=Fa;
if(rt) a[Fa].ch[a[Fa].v<=k]=o,splay(o,rt);//保证复杂度
else rt=o;
}
void del(int k){//删除
int o=rt,tmp;
while(a[o].v!=k) o=a[o].ch[a[o].v<=k];
splay(o,rt);
if(lc&&rc){//分类讨论
tmp=find(rt,a[lc].siz);
splay(tmp,lc); o=rt;
a[lc].ch[]=rc; a[rc].fa=lc;
rt=lc; up(rt); a[rt].fa=;
}else if(lc) a[lc].fa=,rt=lc;
else if(rc) a[rc].fa=,rt=rc;
else rt=;
}
void pre(int o,int k){//前驱
if(!o) return;
if(ans<a[o].v&&a[o].v<k) ans=a[o].v;
pre(a[o].ch[a[o].v<k],k);
}
void last(int o,int k){//后缀
if(!o) return;
if(k<a[o].v&&a[o].v<ans) ans=a[o].v;
last(a[o].ch[a[o].v<=k],k);
}
int main(){
scanf("%d",&n);
while(n--){
scanf("%d%d",&q1,&q2);
if(q1==) ins(q2);
else if(q1==) del(q2);
else if(q1==) printf("%d\n",torank(rt,q2)+);//记得排名+1
else if(q1==) printf("%d\n",a[find(rt,q2)].v);
else if(q1==) ans=-1e9,pre(rt,q2),printf("%d\n",ans);
else ans=1e9,last(rt,q2),printf("%d\n",ans);
}return ;
}

P3369 【模板】普通平衡树(splay)的更多相关文章

  1. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

  2. 【洛谷P3369】普通平衡树——Splay学习笔记(一)

    二叉搜索树(二叉排序树) 概念:一棵树,若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉搜索树 ...

  3. 洛谷.3369.[模板]普通平衡树(Splay)

    题目链接 第一次写(2017.11.7): #include<cstdio> #include<cctype> using namespace std; const int N ...

  4. 洛谷.3391.[模板]文艺平衡树(Splay)

    题目链接 //注意建树 #include<cstdio> #include<algorithm> const int N=1e5+5; //using std::swap; i ...

  5. 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay

    [阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...

  6. 【模板篇】splay(填坑)+模板题(普通平衡树)

    划着划着水一不小心NOIP还考的凑合了… 所以退役的打算要稍微搁置一下了… 要准备准备省选了…. 但是自己已经啥也不会了… 所以只能重新拾起来… 从splay开始吧… splay我以前扔了个板子来着, ...

  7. 【BZOJ3224】Tyvj 1728 普通平衡树 Splay

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...

  8. BZOJ3224/洛谷P3391 - 普通平衡树(Splay)

    BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...

  9. luoguP3369[模板]普通平衡树(Treap/SBT) 题解

    链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...

  10. 平衡树——splay 一

    splay 一种平衡树,同时也是二叉排序树,与treap不同,它不需要维护堆的性质,它由Daniel Sleator和Robert Tarjan(没错,tarjan,又是他)创造,伸展树是一种自调整二 ...

随机推荐

  1. Spring MVC定时服务

    spring-mvc-config.xml <context:component-scan base-package="com.bf" ></context:co ...

  2. js和java的参数传递方式实际都是一样的,都是按值传递

    只不过要注意的是字符串类型在java中是对象,在js是基本数据类型,作为参数传递的时候是拷贝值,

  3. 9个Linux系统常用监控命令

    我们的系统一旦上线跑起来我们自然希望它一直相安无事,不要宕机,不要无响应,不要慢腾腾的.但是这不是打开机器电源然后放任不管就可以得到的.所以我们要监视系统的运行状况,发现问题及时处理. 对于系统和网络 ...

  4. cocosStudio制作ScrollView并在cocos2dx 3.0中使用。

    使用cocosStudio制作界面基本已成为基础了,之前都是拖动一些 Image.Button的小控件,再用到层容器和滚动层的时候,习惯性的用拖动来改变控件的大小.但是你在把其他的控件拖动到上面的时候 ...

  5. java基础(四) -变量类型

    在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: type identifier [ = value][, identifier [= value] ...] ; 格式说明:ty ...

  6. RF基础(一) RF内建函数库BuiltIn

    Robot framework做为一个测试框架,并不是只能做selenium测试,是支持扩展的, 比如说,你引用requests库就可以做接口测试, 那么无论你用什么库 首先要了解, RF本身提供的内 ...

  7. Spring+SpringMVC+MyBatis整合应用

    1)搭建Spring,SpringMVC和MyBatis环境 创建一个web工程 添加MyBatis相关环境 引入数据库驱动包和DBCP连接池开发包 引入MyBatis开发包 添加Spring,Spr ...

  8. mysql----------局域网数据库:如何让navicat链接局域网其他的数据库。

    1.找到被链接的数据库,打开以后有一个自带的mysql数据库,打开以后下面有一个user表,把里面的第一条数据的第一个字段改成% 百分号,然后保存,重启数据库,搞定 2.如果是linux下的话,记得把 ...

  9. python爬虫-基础入门-爬取整个网站《3》

    python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...

  10. ES6之字符串扩展

    ES6字符串新增的常用方法: 1. includes(): 字符串中是否包含某个字符或字符串, 包含的两个字符必须是相连的 let str = 'hello, world' str.includes( ...