很神奇的旋轉操作。
目前沒看到其他資料結構能實現這個功能。平衡樹不好處理區間操作,線段樹很難旋轉。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中的移動,旋轉操作解析
在移動和旋轉之間,最好是指定操作的物件是什麼?有可能是投影矩陣,有可能是模型矩陣。操作投影矩陣的結果就只是改變投影矩陣,模型本身的頂點位置都保持不變,但是因為投影矩陣矩陣變化了,定點對映到新的投影座標系時,頂點的顯示發生了變化。操作模型矩陣的結果就是,投影座標系不變,但是模型頂點對映到了新位置,這兩...