splay tree旋轉操作 hdu 1890

2021-09-08 18:05:51 字數 2856 閱讀 9091

很神奇的旋轉操作。

目前沒看到其他資料結構能實現這個功能。平衡樹不好處理區間操作,線段樹很難旋轉。splay tree搞這個就很簡單了。

下面用的這個模板跑了700ms,好慢,估計是刪除操作太費時了,是時候去找找其他更快的模板了。

#include #include 

#include

#include

using

namespace

std;

#define maxn 100100

//好慢啊 優化下

bool add[maxn];//

延遲標記

struct

splay_tree

t[maxn];

inline

void

init()

inline

void pushup(int

x)

inline

void pushdown(int

x)

if(t[x].son[1

])

add[x]=0;//

不管子節點有沒有,這層一定往下推,沒有子節點相當於標記無效。

} }

inline

int newnode(int key, int fa) //

新建乙個節點並返回

inline

void rotate(int x, int p) //

0左旋 1右旋

void splay(int x, int to) //

將x節點移動到to的子節點中

else

}if(to == 0) rt=x;

}int getpth(int p, int to) //

返回第p小的節點 並移動到to的子節點中

else

x=t[x].son[0

]; }

splay(x, 0);

return

x; }

int find(int key) //

返回值為key的節點 若無返回0 若有將其轉移到根處

if(x) splay(x, 0

);

return

x; }

int prev() //

返回根節點的前驅 非重點

splay(x, 0);

return

x; }

int next() //

返回根結點的後繼 非重點

splay(x, 0);

return

x; }

void insert(int key) //

插入key值

t[x].size++;//

既然一定調整

x=t[x].son[key >t[x].key];

}if(!x)

x = t[y].son[key > t[y].key] =newnode(key, y);

splay(x, 0);}}

void delete(int

key)

int y=t[x].son[0

]; pushdown(y);

//終於找到了,只要往下找就得pushdown

while(t[y].son[1

])

int z=t[x].son[1

]; pushdown(z);

while(t[z].son[0

])

if(!y && !z)

if(!y)

if(!z)

splay(y, 0);

splay(z, y);

//前驅和後繼相同是什麼鬼

t[z].son[0]=0

; pushup(z);

pushup(y);

}//int getrank(int key)

//獲得值<=key的節點個數 並將其轉移到根處 若//

//else

//x=t[x].son[0];//}

//splay(y, 0);

//return ret;//}

//這個刪除太醜了

//void delete(int l, int r)

//刪除值在[l, r]中的所有節點 l!=r

////

if(!p)

////

if(!q)

////

splay(p, q);

//t[p].son[1]=0;

//pushup(p);

//pushup(q);//}

void display(int

x)

}spt;

struct

node

g[maxn];

intcmp(node t1,node t2)

intmain()

//死迴圈什麼鬼。

//printf("nishi sb ma?");

sort(g+1,g+1+n,cmp);

for(int i=1;i<=n;i++)//

開始旋轉

//這裡那裡gg了,果真還是這裡有問題。

//第一次就刪除了兩個,不能看

//printf("\n");

spt.delete(g[i].id);

//每次操作之後,都把結果列印一遍

//printf("\n");

} printf("\n

");}

return0;

}

Splay演算法旋轉操作的模擬

本篇隨筆簡單講解一下splay演算法維護平衡樹時的旋轉操作。重點集中在如何模擬旋轉。對splay沒有概念的同學請移步 splay詳解 先上圖再講 這是右旋。ch x 0 ch x 1 x的左右兒子 fa x x的爹 val x x的值 size x x的子樹大小 我們觀察旋轉後的東西,發現對於全部節...

字串左旋轉操作

定義字串的左旋轉操作,把字串前面的若干個字元移動到字串的尾部。如把字串abcdef左旋轉2位得到字串cdefab,請實現字串左旋轉函式。要求時間複雜度o n 空間複雜度o 1 解法是將前k個字串反轉,後面的字串同樣反轉,再對整個字串進行一次翻轉。1void swap string a,int low...

opengl中的移動,旋轉操作解析

在移動和旋轉之間,最好是指定操作的物件是什麼?有可能是投影矩陣,有可能是模型矩陣。操作投影矩陣的結果就只是改變投影矩陣,模型本身的頂點位置都保持不變,但是因為投影矩陣矩陣變化了,定點對映到新的投影座標系時,頂點的顯示發生了變化。操作模型矩陣的結果就是,投影座標系不變,但是模型頂點對映到了新位置,這兩...