存个模板,这次是splay的;

题目见这个题解: <--(鼠标移到这儿)

代码如下:

 #include<cstdio>
#define INF 2147483647
using namespace std;
struct poo
{
int size,cnt,value;
int ch[],fa;
}data[];
int root,tot,x,n;
void insert();//插入v=x(x为全程量)的点//
void del();//删除v=x(x为全程量)的点//
int rank();//查找v=x(x为全程量)的点的排名 //
int find();//查找排名为x(x为全程量)的点 //
int las(int );//查找v=x(x为全程量)的点的前驱含splay//
int nex(int );//查找v=x(x为全程量)的点的后继含splay//
void splay(int );//含roll//
void roll(int );//含up//
int get_wh(int );//查找v=x(x为传参)的点的poo编号含splay//
int get(int );//查找poo=x(x为传参)的点的fa的相应儿子//
void cut(int );//切掉poo=x(x为传参)的点//
void make_data(int );//建立fa=f(f为传参)的点//
void up(int );//up poo=x(x为传参)的点//
void print(int );
void puttree(int ,int );
int main()
{
// freopen("input4.in","r",stdin);
// freopen("splay.out","w",stdout);
int i,j;
scanf("%d",&n);
root=;
for(i=;i<=n;i++){
scanf("%d%d",&j,&x);
switch(j){
case :insert();break;
case : del();break;
case : printf("%d\n",rank());break;
case : printf("%d\n",find());break;
case : insert();printf("%d\n", las(x));del();break;
case : insert();printf("%d\n", nex(x));del();break;
}
}
}
void insert(){
if(!root){
root=++tot;
make_data();
return;
}
int i=root,j=;
while(i){
if(data[i].value==x){
data[i].cnt++;data[i].size++;
splay(i);
return;
}
if(data[i].value>x)
j=i,i=data[i].ch[];
else
j=i,i=data[i].ch[];
}
int wh=data[j].value<x?:;
data[j].ch[wh]=++tot;
make_data(j);
splay(tot);
}
void del(){
int i,wh;
i=get_wh(x);
if(data[i].cnt>){
data[i].cnt--;data[i].size--;
return;
}
if(data[i].ch[]*data[i].ch[]==&&data[i].ch[]+data[i].ch[]!=){
wh=data[i].ch[]==?:;
root=data[i].ch[wh];
data[root].fa=;
cut(i);
return;
}
int old=root,pre=get_wh(las(data[root].value));
splay(pre);
data[data[old].ch[]].fa=root;data[root].ch[]=data[old].ch[];
cut(old);
up(root);
}
int rank(){
int now;
now=get_wh(x);
return data[data[now].ch[]].size+;
}
int find(){
int ans=root;
while(!(x>data[data[ans].ch[]].size&&x<=data[data[ans].ch[]].size+data[ans].cnt)){
if(x<=data[data[ans].ch[]].size)
ans=data[ans].ch[];
else{
x-=data[ans].size;
ans=data[ans].ch[];
x+=data[ans].size;
}
}
return data[ans].value;
}
int las(int x){
int i=get_wh(x);
i=data[i].ch[];
while(data[i].ch[])
i=data[i].ch[];
// splay(i);
return data[i].value;
}
int nex(int x){
int i=get_wh(x);
i=data[i].ch[];
while(data[i].ch[])
i=data[i].ch[];
// splay(i);
return data[i].value;
}
void splay(int now){
for(int fa=data[now].fa;fa=data[now].fa;roll(now))
if(data[fa].fa)
roll(get(now)==get(fa)?fa:now);
root=now;
}
void roll(int now){
int fa=data[now].fa,fafa=data[fa].fa,wh=get(now);
data[fa].ch[wh]=data[now].ch[wh^];data[data[fa].ch[wh]].fa=fa;
data[now].ch[wh^]=fa;data[fa].fa=now;
data[now].fa=fafa;
if (fafa)
data[fafa].ch[data[fafa].ch[]==fa]=now;
up(fa);up(now);
}
int get_wh(int x){
int i=root;
while(data[i].value!=x){
if(data[i].value>x)
i=data[i].ch[];
else
i=data[i].ch[];
}
splay(i);
return i;
}
int get(int x){
return data[data[x].fa].ch[]==x;
}
void cut(int x){
data[x].ch[]=data[x].ch[]=data[x].cnt=data[x].fa=data[x].size=data[x].value=;
}
void make_data(int f){
data[tot].fa=f;
data[tot].size=data[tot].cnt=;data[tot].value=x;
}
void up(int x){
data[x].size=data[data[x].ch[]].size+data[data[x].ch[]].size+data[x].cnt;
}
void print(int now){
if(!now)return;
print(data[now].ch[]);
printf("%d ",data[now].value);
print(data[now].ch[]);
}
//splay 17.2.20
//10
//1 5
//4 1
//1 6
//1 7
//1 10
//1 3
//1 4
//6 2
//1 8
//5 9

祝AC

普通平衡树Tyvj1728、luogu P3369 (splay)的更多相关文章

  1. 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...

  2. [luogu P3369]【模板】普通平衡树(Treap/SBT)

    [luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...

  3. 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...

  4. 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...

  5. 【模板】普通平衡树(权值splay)

    安利splay讲解: [洛谷日报第62期]Splay简易教程 [模板]普通平衡树(luogu) Description 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下 ...

  6. 【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay

    题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...

  7. luogu P3369 【模板】普通平衡树(splay)

    嘟嘟嘟 突然觉得splay挺有意思,唯一不足的是这几天是一天一道,debug到崩溃. 做了几道平衡树基础题后,对这题有莫名的自信,还算愉快的敲完了代码后,发现样例都过不去,然后就陷入了无限的debug ...

  8. 普通平衡树Tyvj1728、luogu P3369 (treap)

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

  9. fhq treap ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : LibreOJ #104. 普通平衡树 #include <cstdio> #include <iostream> #include <algorithm ...

随机推荐

  1. leetcode-884-两句话中的不常见单词

    题目描述: 给定两个句子 A 和 B . (句子是一串由空格分隔的单词.每个单词仅由小写字母组成.) 如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的. 返回 ...

  2. L05-Linux部署msmtp+mutt发送邮件

    一.前言 首先,得明白发送一封邮件的流程,下面一段理论摘抄自廖雪峰的官网网站https://www.liaoxuefeng.com/article/00137387674890099a71c04005 ...

  3. FCN详解

    转载自:https://www.cnblogs.com/gujianhan/p/6030639.html 论文地址:https://arxiv.org/pdf/1411.4038v1.pdf 背景 C ...

  4. 如何给oneindex网盘增加评论、密码查看、read me,头提示功能。

    来自我的博客:www.resource143.com 微信公众号:资源库resource 视频教程地址 点击查看 评论功能 特性 使用 GitHub 登录 支持多语言 [en, zh-CN, zh-T ...

  5. c# Equals方法

    很多C#的教材都会强调对象相等的概念.我们都知道,在C#的世界里存在两种等同性.一种是逻辑等同性:如果两个对象在逻辑上代表同样的值,则称他们具有逻辑等同性.另一种是引用等同性:如果两个引用指向同一个对 ...

  6. shiro学习笔记_0500_授权

    1,授权:给身份认证通过的人,授予他可以访问某些资源的权限. 2,权限粒度:分为粗粒度和细粒度. 粗粒度:例如对 user 的 crud,也就是通常所说的对表的操作. 细粒度:对表中记录的操作.如 只 ...

  7. ubuntu手动安装PhantomJS

    1.切换到主目录:cd ~2.下载安装包:https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-Linux-x86_64.ta ...

  8. 【es6】变量解构赋值

    1.数组解构赋值 let [a,b,c]=[1,2,3];//数组解构赋值,注意:左右两边格式需一致 let [a,b]=[1,2,3];//不完全解构,取位置靠前的值 let [a=1,b]=[un ...

  9. Eclipse/MyEclipse如何快速提取变量(最强帮手)

    不多说,直接上干货! Eclipse里如何快速提取变量? 按alt+shift+l MyEclipse里如何快速提取变量? 按alt+shift+l 成功!快速提取变量 扩展学习 Eclipse/My ...

  10. *2.3.3-加入monitor

    验证平台必须监测DUT的行为,只有知道DUT的输入输出信号变化之后,才能根据这些信号变化来判定DUT的行为是否正确. 验证平台中实现监测DUT行为的组件是monitor.driver负责把transa ...