現在給出將樹鏈剖分上的邊權轉化為點權的方法
也就是將邊權轉到它下方的點去
我們通過畫圖可以發現,這樣的話,我們會多算最近公共祖先上方的點
方法一:先不考慮的多算的部分,還按原來的方法來,在之後消除最近公共祖先的影響
我們只需要在原來的**基礎上將\(query \_\ path\)改成
long long query_path(int u,int v)
{ long long ans=0;
while(top[u]!=top[v])
{ if(dep[top[u]]將\(updatp\_\ path\)改成
void update_path(int u,int v){
while(top[u]!=top[v])
{ if(dep[top[u]]方法二
直接在修改和查詢操作的時候,不將最近公共祖先算進去就行
這個是由我們的\(dfs\)序決定的
long long query_path(int u,int v)
{ long long ans=0;
while(top[u]!=top[v])
{ if(dep[top[u]]\(update \_\ path\)
void update_path(int u,int v){
while(top[u]!=top[v])
{ if(dep[top[u]]注意
在遞迴的時候記得檢查一下我們在遞迴到最底層的時候,我們是否return 不然會一直遞迴下去,發生段錯誤
POJ2763 樹鏈剖分,邊權,模板)
題意 給定乙個樹形圖,某人原來在 s 點,每條邊 路 有通過的時間花費,有兩種操作 1.查詢某人到 u 點花費的時間 2.更新某條路的時間花費。解題思路 前面樹鏈剖分練得一直是點權,但一遇邊權懵逼了。下裡面的 是從點權改過來的。其實邊權和點權是差不多的。大致意思就是,取每條邊連個點中,處於下位的 更...
POJ3237 Tree 樹鏈剖分 邊權
傳送門 n個點的,n 1條邊 修改單邊邊權 將a b的邊權取反 查詢a b邊權最大值 修改邊權就查詢點的深度大的點,用大的點去存這條邊的邊權,其餘的就和點權的是一樣的了 取反操作用線段樹維護,區間最大值取反就是區間最小值,區間最小值取反就是區間最大值 所以維護兩顆線段樹即可,lazy標記表示覆蓋單邊...
樹鏈剖分 點權
time limit 10 sec memory limit 162 mb submit 7568 solved 3109 submit status discuss description 一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作...