平衡樹就是左旋右旋的一種樹,趙老師講資料結構的時候一直沒實現,覺得很簡單。
結果是很簡單,但是,,**量有點不敢恭維。
下面是乙個大神的板子。自己敲了一遍。
#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....