題目描述
題解:左偏樹,一棵向左傾斜的二叉樹。
板子:
#include#include#include
using
namespace
std;
const
int n = 100050
;template
inline
void read(t&x)
while(ch>='
0'&&ch<='9')
x = f*c;
}int
n,m,fa[n],v[n],dis[n],ls[n],rs[n];
int merge(int x,int
y)int get_top(int
x)int erase(int
x)int
main()
for(int opt,x,y,i=1;i<=m;i++)
else
}return0;
}
$upd:$
之前版本被$luogu$資料卡掉了,$get_top$操作是$o(n)$的。(0_0)
更新路徑壓縮的做法。
首先合併兩棵樹就並一下,刪除操作要求刪除堆頂元素。
肯定是不能直接刪的。
怎麼做呢,合併兒子後將自己的指標指向新的堆頂就好了。
**:
#include#include#include
using
namespace
std;
const
int n = 100050
;template
inline
void read(t&x)
while(ch>='
0'&&ch<='9')
x = f*c;
}int n,m,ch[n][2
],v[n],dep[n],ff[n];
int findrt(int x)
int merge(int x,int
y)bool
ot[n];
intmain()
else
x =findrt(x);
ot[x] = 1
; printf(
"%d\n
",v[x]);
int now = merge(ch[x][0],ch[x][1
]); ff[x] = ff[now] =now;}}
return0;
}
左偏樹 模板
神經病也可以寫成右偏樹 具體左偏指左節點的距離 geq 右節點的距離 距離指離最近擁有空節點的節點的距離 乙個節點的值一定 或 leq 或 geq 或 其子節點的值 由於左偏性質,每次可以合併至右邊,維護左偏性質後就可以保證複雜度 被踩爆的板子 或者是我?include define ls lson...
模板 左偏樹
洛谷模板題 一聽左偏樹這個名字就感覺左偏。左偏樹是什麼,好像就是個堆,大根堆或小根堆,可以支援合併,取堆頂元素,刪除堆頂元素,插入元素的操作。一些說明 左偏樹節點除了應有的東西,還有鍵值和距離,鍵值用於比較大小,距離是什麼?距離是這樣定義的 節點i稱為外節點 external node 當且僅當節點...
模板 左偏樹
可在log複雜度合併的堆 每個節點有乙個距離,具體定義我不知道 1.滿足堆的性質 2.左子節點距離 右子節點 3.節點距離 右子節點距離加1 按照以上的性質實現merge x,y 先選出x,y中比較大的那個 大根堆為例 再拿它的右兒子和另乙個去merge,如果merge出來不符合性質2就swap一下...