洛谷 2680 運輸計畫 題解

2021-10-02 03:13:08 字數 2963 閱讀 6471

部落格觀賞效果更佳

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...