luogu2680 運輸計畫

2022-06-07 19:51:10 字數 1127 閱讀 7862

首先二分列舉答案t,考慮刪去的邊應滿足的條件——所有大於

t的鏈全部經過且長度不小於最長鏈

-t,第二個條件很好判斷,考慮第乙個條件。

先考慮有祖先-後代關係的鏈,用如果把這條鏈到

1看成乙個序列,那麼差分一下再

dfs一遍就可以對這條鏈上每乙個點打上標記。

然後沒有祖先-後代關係的鏈,同樣可以分解成兩條鏈,到x到

lca(x,y)和y

到lca(x,y)

,同樣處理即可,最後時間複雜度o(nlogn)

(lca預處理)。

1 #include2

using

namespace

std;

3#define n 300005

4struct

jiedge[n<<1];7

int e,n,m,x,y,z,a[n],b[n],c[n],head[n],f[n][21],in[n],out

[n],s[n],dp[n],ans[n];

8void add(int x,int y,int

z)14

bool pd(int x,int

y)17

int lca(int x,int

y)23

void dfs(int k,int fa,int

sh)32

void dfs2(int k,int

fa)38}39

bool pd(int

k)49 dfs2(1,0

);50

for(int i=1;i<=n;i++)

51if ((dp[i]==tot)&&(s[i]-s[f[i][0]]>=ans[0]-k))return1;

52return0;

53}54int

main()

62 dfs(1,1,x=0

);63

for(int i=1;i<=m;i++)

69 x=0

;70 y=ans[0

];71

while (x

76 printf("%d"

,x);

77 }

view code

luogu2680 運輸計畫

很明顯,由於是求最長路的最小值,我們可以使用二分求解.我們二分乙個長度 mid 將所有使得 dis u,v 大於 mid 的點對 u,v 找出,設總共有 m 條這樣的邊,那麼我們需要改變的改變邊一定是被這 m 條邊都經過的邊,所以我們只需要找到滿足這個要求的長度最大的改變邊使得這 m 條邊中最長的一...

Luogu2680 運輸計畫

我們對每條邊 i 單獨考慮,那麼設 v i 為這條邊的長度,經過它的路徑長度集合為 s 未經過它的路徑長度集合為 t ans i max begin s v i t end ans min ans i 對於 s 我們直接對於一條長度為 l 的路徑,該路徑上的邊都對 l 取 max 用樹鏈剖分很容易處...

題解 LuoGu2680 運輸計畫

原題傳送門 去年覺得是道難題,現在覺得這著實是道大水題 題意 一棵樹,給出幾條路徑 從點x到點y 可以使一條邊長度變為0,使得路徑長度最大值最小 思路 就搞定了 接著想如何實現 總結 noip的題目還是很可以的,演算法 思維難度不高,應用性還是比較強的 用到了許多小演算法 lca,二分,樹上差分 c...