可並堆有一種黑科技是用線段樹合併實現,還能可持久化,時間複雜度nlogn。ide
這裏介紹左偏樹。spa
d值表示走右邊到葉子的距離。知足d[r] <= d[l]code
寫法上用rt維護根節點,相似線段樹。blog
不要把兩個merge寫混淆了!遊戲
放一個模板。get
namespace lt { int ls[N], rs[N], siz[N], d[N], rt[N]; LL val[N], sum[N]; int merge(int x, int y) { if(!x || !y) return x | y; if(val[x] < val[y]) std::swap(x, y); rs[x] = merge(rs[x], y); if(d[rs[x]] > d[ls[x]]) std::swap(ls[x], rs[x]); d[x] = d[rs[x]] + 1; sum[x] = sum[ls[x]] + sum[rs[x]] + val[x]; siz[x] = siz[ls[x]] + siz[rs[x]] + 1; return x; } inline void exmerge(int x, int y) { // y -> x rt[x] = merge(rt[x], rt[y]); return; } inline void pop(int x) { rt[x] = merge(ls[rt[x]], rs[rt[x]]); return; } inline int getSum(int x) { return sum[rt[x]]; } inline int getSiz(int x) { return siz[rt[x]]; } inline void init(int i, LL v) { val[i] = v; sum[i] = v; siz[i] = 1; d[i] = 1; rt[i] = i; return; } }
洛谷P1552 派遣 模板。it
洛谷P2713 羅馬遊戲 額外用一個並查集維護每一個人在左偏樹中的編號。event
洛谷P4331 數字序列 主要是想到那個毒瘤合併的結論...模板