左偏樹是一種可以快速支援合併等操作的堆, 是可並堆中**複雜度最低,也最容易理解的一種(注意左偏樹的每一棵子樹都為左偏樹)
左偏樹是一種二叉樹, 除了有二叉樹的左右兒子,還有2個屬性,鍵和距離。下面是左偏樹的一些基本性質。
struct pointtree[maxn];
顧名思義, merge操作就是把兩個左偏樹並起來, 注意並後的左偏樹一定要滿足上面的四條性質。現在我們令x, y為要合併的兩個堆的根, 下面即是步驟。
insert操作為插入乙個新的節點, 把這個節點看做一顆新的左偏樹即可
int new(int x, int y)
把根提出來, 合併左右節點就好了
root[x]= merge(tree[x].ls, tree[x].rs);
emmm, \(top = tree[x].val\) (x 為 堆的根)
以洛谷p3377為例, 因為此題需要維護聯通性, 所以需要像並查集一樣暴力找父親(不能路徑壓縮)
**醜, 建議不看, 以後會更新的
#include using namespace std;
int n,m;
struct pointtree[1000010];
templatevoid read(t &a)
while(c >= '0' && c <= '9')
a = w*s;
}int merge(int x, int y)
tree[x].dis = tree[tree[x].rs].dis + 1;
return x;
}int find(int x)
int main()
for (int i = 1; i <= m; i++)
if(opx == 2)
}return 0;
}
演算法學習筆記 主席樹
出題出掛了,來好好學主席樹了 線段樹沒了 對於使用線段樹,我們可以較好地解決 帶修改的全域性第k大 或小 問題 但是對於某個區間進行求第k大 或小 操作就不是那麼容易了。可持久化一詞在資料結構中十分常見。可持久化 的意思就是 帶有歷史版本的 資料結構。而在我們所接觸到的基本資料結構中 如陣列 並查集...
演算法學習筆記 線段樹
在樹狀陣列那篇部落格中,留下了乙個坑 區間修改區間查詢 樹狀陣列部落格傳送門 今天我們就要來解決這個問題 都很簡單 線段樹是一種可以較快維護滿足區間可加性區間資訊 如 區間和,區間積,區間最大最小等 的資料結構,其基本思想就是二分。注 區間可加性指一些可以通過子區間資訊合併維護的資訊,如區間最大就可...
演算法學習筆記 Trie 樹(字典樹)
2.3 trie 樹的適用範圍 3.總結 trie 樹,中文名為字典樹,是一種字串的高效處理演算法。trie 樹實現的功能就是快速的查詢一堆字串裡面有沒有某個串是另乙個串的字首,字尾等等。trie 樹首先是一棵樹,比如下面這棵樹就是一棵 trie 樹。這棵樹是由ab,abd,ac,bd四個字串構成的...