存个模板,这次是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. 调用jdbc已经写成的方法----jdbc工具类抽取方式一

    package web09; /*获取连接和释放资源的方法 */ import java.sql.Connection; import java.sql.DriverManager; import j ...

  2. 「雅礼集训 2018 Day10」贪玩蓝月

    题目链接 题意分析 我们考虑维护两个栈 分别支持左边的插入删除以及右边的插入删除 然后对于两两个栈的我们需要用背包求出最优答案 注意 删除时如果不够的话 我们需要从另一个栈中取出一半加入另一个栈中 注 ...

  3. [转] HBase异常:hbase-default.xml file seems to be for an old version of HBase

    [From] https://blog.yoodb.com/yoodb/article/detail/157 使用HBase Java Client连接HBase服务端创建Configuration对 ...

  4. archlinux中gedit乱码的解决方法

    转自https://blog.csdn.net/oFAITH12345/article/details/24962545 例如:gedit key.c --encoding=GB18030 打开文件后 ...

  5. JavaScript设计模式-4.继承和聚合

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 十分有趣的this指向题

    var num=5;//9 =>++this.num=>10 var obj={ num:3, fn:function() { num = 9;//window.num=9 (functi ...

  7. Spring声明式事务为何不回滚

  8. C#控件的Resize事件

    1. 当控件大小发生改变时,就会触发该事件 所以适合动态调整UI的布局, 例如: 国际化,不同语言导致控件长度不同: 控件的内容是动态增加的,也可以使用. 2.必须是大小会发生改变的控件才会触发该事件 ...

  9. 快捷键 -- windows

    win+数字 :   打开任务栏第n个图标 Win+D :快速显示桌面 Win+R :快速运行打开软件 例如 cmd services,msc Win+E:打开资源管理器 Win+L:快速锁定计算机 ...

  10. 决策树遇到sklearn.exceptions.NotFittedError: XXX instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.的解决方案

    1.异常信息: C:\Python36\python36.exe "E:/python_project/ImoocDataAnalysisMiningModeling/第6章 挖掘建模/6- ...