treap平衡樹練習

2021-09-25 14:04:20 字數 1886 閱讀 7847

平衡樹就是左旋右旋的一種樹,趙老師講資料結構的時候一直沒實現,覺得很簡單。

結果是很簡單,但是,,**量有點不敢恭維。

下面是乙個大神的板子。自己敲了一遍。

#include using namespace std;

#define maxn 100010

#define inf 0x7fffffff

struct treapnode treap[maxn];

int numnodes, root, n;

int newnode(int val) // 建立乙個新的節點

void update(int p) // 更新某乙個點的 size 方便獲取排名

void build() // 初始化

int getrankbyval(int p, int val)

// 上下兩個函式很好理解,不作贅述

// 一切從 bst 性質出發

int getvalbyrank(int p, int rnk)

void zig(int &p)

void zag(int &p)

void insert(int &p, int val)

if (val == treap[p].value)

if (val < treap[p].value) else // zig 和 zag 操作,保證滿足大根堆性質

update(p);

} // 插入乙個點

int getpre(int val)

break;

} if (treap[p].value < val &&

treap[p].value > treap[ans].value) ans = p; // 嘗試更新答案

p = val < treap[p].value ? treap[p].lchild : treap[p].rchild;

} return treap[ans].value;

} // 獲取前驅

int getnext(int val)

break;

} if (treap[p].value > val &&

treap[p].value < treap[ans].value) ans = p; // 嘗試更新答案

p = val < treap[p].value ? treap[p].lchild : treap[p].rchild;

} return treap[ans].value;

}void remove(int &p, int val) else if (treap[p].lchild != 0 || treap[p].rchild != 0) else // 通過旋轉來刪除節點

update(p);

} else p = 0;

return;

} if (val < treap[p].value) remove(treap[p].lchild, val);

else remove(treap[p].rchild, val);

update(p);

}int main()

case 2:

case 3: // 減一

case 4: // 加一

case 5:

case 6:

} }return 0;

}

今天上午剛剛搞明白什麼是字尾陣列,只寫了乙個模板題,下午就搞字尾自動機。這是第二遍看字尾自動機了,感覺有點東西了,雖然還是不太明白,但是事不過三。明天再看一遍。相信就沒問題了。

加油!7.25晚11點更新

**打臉,又是沒看懂

7.26上午11點更新

**打臉

7.26下午5點更新

**打臉

平衡樹之Treap

乙個集合支援快速插入 刪除乙個數字。支援快速查詢乙個數字在所有已插入數字中的排名。支援刪除大小在某乙個區間內的數字。動態維護乙個數列。可以在數列的任何位置插入刪除,求區間和,min,max,進行區間翻轉 這就需要用到二叉查詢樹 binary search tree 性質 這是一棵二叉樹。對於任意乙個...

Treap 普通平衡樹

最近學習了treap,找了道題目做做 全抄hz.因為普通的二叉樹,會退化成鏈 所以你把讀入打亂順序再構造二叉樹,就明顯卡不掉 平平均深度logn treap就是這樣的 在插入乙個數時,我們搞乙個rnd,賦值隨機 然後如果當前的這個節點rnd小於其父節點,那麼就把他轉到父節點的位置 這樣好比是給這個節...

平衡樹模板 Treap

演算法標籤 treap 種下第一棵平衡樹 這是一道模板題。如果覺得這個題水的可以做一下4544壓行,是千古神犇花爸爸出的神犇題。您需要寫一種資料結構 可參考題目標題,但是這句話其實並沒有什麼用233 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3....