Splay的一些操作

2022-08-13 22:00:17 字數 1631 閱讀 5623

推薦:

簡單的定義:

fa[x]為x的父親,son[x][0/1]為x的左右兒子

簡單的操作

get(x):查詢x為父親的哪乙個兒子

int

get(int x)

rotate(x):將x旋轉到父親

void rotate(int

x)

splay(x,goal):將x旋轉到goal的兒子

void splay(int x,int goal,int

k)

if(goal==0) rt[k]=x;

}

splay的任何旋轉操作不影響這個樹的中序遍歷

因此可以維護乙個陣列:

對於每乙個節點為 size 表示整個子樹的和

陣列的下標   ->  樹上排名   ->  中序遍歷的位置

那麼直接可以通過互換乙個節點左右兒子,改變名次

splay之間的互相插入

遍歷一遍 + 插入

清空x

void earse(int x)

插入x到rt[k]的splay

void inst(int y,int

k)

f=x;x=son[x][vi[y]>vi[x]];

}fa[y]=f;son[f][vi[y]>vi[f]]=y;

tol[y]=num[y];update(f);splay(y,0

,k);

}

遍歷

void merge(int x,int a) //

x -> a

彙總:

int

rt[n];

struct

tree

intget(int x)

void update(int x)

void rotate(int

x)

void splay(int x,int goal,int

k)

if(goal==0) rt[k]=x;

}void ins(int d,int fs,int

k)

while

(x)

f=x;x=son[x][d>vi[x]];

}++tot;fa[tot]=f;son[f][d>vi[f]]=tot;vi[tot]=d;

num[tot]=tol[tot]=fs;update(f);splay(tot,0

,k);

}void earse(int x)

void inst(int y,int

k)

f=x;x=son[x][vi[y]>vi[x]];

}fa[y]=f;son[f][vi[y]>vi[f]]=y;

tol[y]=num[y];update(f);splay(y,0

,k);

}int find(int d,int

k)

return

up; }

void merge(int x,int a) //

x -> a

} t;

ubuntu的一些操作

1.ubuntu,windows啟動順序修改 圖形化方法 sudo apt get install startupmanager,然後終端startupmanager,圖形化修改啟動順序,其它 2.ubuntu遠端桌面 window xp訪問ubuntu 需在ubuntu設定允許遠端訪問,可以加密訪...

Dom的一些操作

dom 的意思是 文字 物件 模型.寫幾個常用的dom 方便以後查詢 document.getelementbyid id 這個的出鏡率非常的高 有華山那麼高.document.getelementsbytagname name 封裝的時候是必用的 obj.previoussibling 已知節點的...

矩陣的一些操作

typedef.h define true 1 define false 0 define ok 1 define error 0 define infeasivle 1 define overflow 2 define list init size 100 define listincrement...