部落格觀賞效果更佳
n
nn個點的邊帶權樹,給m
mm條關鍵的鏈。把樹上一條邊的權值變為0,使得m
mm條鏈的和中,最大值最小。 n,m
<=1
e5
n,m<=1e5
n,m<=1
e5。二分最大值k
kk。現在考慮如何檢驗乙個kkk。
找到所有鏈和》
k>k
>
k的鏈,設這裡面最長的鏈長度為s
ss,有c
cc條這樣的鏈。用樹鏈剖分找到被所有c
cc條鏈都覆蓋的邊。設邊權為w
ww,如果s−w
<=k
s-w<=k
s−w<=k
,又因為這條邊被所有和》
k>k
>
k的鏈都覆蓋了,所以,將這條邊邊權設為0
00,就珂以把所有和》
k>k
>
k的鏈修♂正回來。那就滿足條件了,檢驗結果為true。
然後就這樣二分即珂。
關於如何求被所有鏈都覆蓋的邊
如果您足夠明智,跳過這個部分好了。
開一顆臨時的樹,所有邊權為0
00,樹鏈剖分維護:對於所有和》
k>k
>
k的鏈(a,
b)
(a,b)
(a,b
),在鏈上的邊權都+1。
然後只要找邊權=c=c
=c的邊即珂。
但是樹鏈剖分維護的是點權,怎麼把邊權轉化成點權呢?只要把一條邊的權值,記錄在這條邊的兒子上即珂。然後我們對於鏈(u,
v)
(u,v)
(u,v
)作加法操作的時候,記得把lca
(u,v
)lca(u,v)
lca(u,
v)的操作給撤回掉(就是減掉),因為這個是多算的。
#include
using namespace std;
namespace flandre_scarlet
ed[n<<1]
;void
clear
(int _v=n,
int _e=n<<1)
void
addedge
(int u,
int v,
int w=1)
; head[u]
=edgecount;
}void
add2
(int u,
int v,
int w=1)
intstart
(int u)
intto
(int u)
intlabel
(int u)
intnext
(int u)
}g;class
bit//樹狀陣列
void
add(
int pos,
int val=1)
}void
radd
(int l,
int r,
int val=1)
intquery
(int pos)
return ans;
}}t;
voidr1(
int&x)
int n,m;
int a[n]
,b[n]
;void
input()
int fa[n]
,deep[n]
,size[n]
,dis[n]
;int son[n]
,val[n]
;//val[i]: i和fa[i]之間的邊權,就是上面說的,「把邊權記錄在該邊的兒子上」
//dis[i]: i到根節點的帶權距離(就是經過的所有邊權的和)
void
dfs1
(int u,
int f)}}
}int dfsid[n]
,top[n]
,time=0;
void
dfs2
(int u,
int topu)
}int
lca(
int u,
int v)
//樹剖求lca (真的只是個lca,沒別的)
return deep[u]
?u:v;
}int
pathlen
(int u,
int v)
//求鏈的帶權長度
void
pathadd
(int u,
int v,
int w=1)
if(deep[u]
>deep[v]
)swap
(u,v)
; t.
radd
(dfsid[u]
,dfsid[v],1
);//常規樹剖操作
int l=
lca(u,v)
; t.
radd
(dfsid[l]
,dfsid[l],-
1);//把多算的減掉
}int maxlen;
bool
cxk(
int k)
f(i,
1,n)
}return
false;}
void
soviet()
printf
("%lld\n"
,l);
}#define flan void
flan ismywife()
#undef int
//long long
}int
main()
洛谷 P2680 運輸計畫
公元 2044 年,人類進入了宇宙紀元。l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物 流飛船需要從 ui 號星球沿最快的宇航路徑飛行到 vi 號星球...
NOIP2015運輸計畫(洛谷2680)
標籤 樹鏈剖分,二分 題目背景 公元 2044 年,人類進入了宇宙紀元。題目描述 l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物 流飛船需要從 ui ...
題解 LuoGu2680 運輸計畫
原題傳送門 去年覺得是道難題,現在覺得這著實是道大水題 題意 一棵樹,給出幾條路徑 從點x到點y 可以使一條邊長度變為0,使得路徑長度最大值最小 思路 就搞定了 接著想如何實現 總結 noip的題目還是很可以的,演算法 思維難度不高,應用性還是比較強的 用到了許多小演算法 lca,二分,樹上差分 c...