存个模板,这次是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. php-fpm epoll封装

    参考 http://www.jianshu.com/p/dac223d7d9ad 事件对象结构 //fpm_event.h struct fpm_event_s { int fd; /* IO 文件句 ...

  2. POJ 2209

    #include<iostream> #include<stdio.h> #include<algorithm> #include<math.h> #d ...

  3. Vue 不睡觉教程3 - 来点实在的:自动计算剩余时间的任务列表

    目标前两课教的是入门和文件结构.都没有什么实在的东西.这次我们要来点实在的.我们要做出一个待办列表.这个待办列表有以下特点: 可以自动从文本中抽取出这件事情的开始时间可以显示当前距离这件事情的开始时间 ...

  4. 逆向学习-Windows消息钩取

    钩子 Hook,就是钩子.偷看或截取信息时所用的手段或工具. 消息钩子 常规Windows流: 1.发生键盘输入事件时,WM_KEYDOWN消息被添加到[OS message queue]. 2.OS ...

  5. ubuntu 16.04安装后的简单优化

    1.更换更新源为国内源: sudo vim /etc/apt/sources.list vim 打开更新源配置文件添加国内源进去,这里添加阿里源 deb http://mirrors.aliyun.c ...

  6. Mac 10.12安装XMind

    下载: (链接: https://pan.baidu.com/s/1i4FmspJ 密码: ydc2)

  7. 开源一个Java Class实现Openfire登陆、推出、消息发送,方便其他系统集成IM功能了

    开源一个Java Class实现Openfire登陆.推出.消息发送 N年前写的,希望对Openfire开发新手有帮助哦 import java.util.*; import java.io.*;   ...

  8. 找到MySQL配置文件默认路径

    如果不知道当前使用的配置文件的路径,可以尝试下面的操作: # which mysqld /usr/local/mysql/bin/mysqld # /usr/local/mysql/bin/mysql ...

  9. 【Guava】基于guava的重试组件Guava-Retryer

    一.使用场景 在日常开发中,我们经常会遇到需要调用外部服务和接口的场景.外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失 ...

  10. js读取cookie信息

    1. 第一种方式读取cookie信息:用document.cookie.split(“; “)的方式把字符串分割成几个段,然后遍历整个数组 //javascript方法 function getCoo ...