noip2018 luogu5021 賽道修建

2022-04-06 13:32:53 字數 2793 閱讀 4014

c 城將要舉辦一系列的賽車比賽。在比賽前,需要在城內修建mm

條賽道。

c 城一共有nn

個路口,這些路口編號為

1,2,…,n1,

2,…,

n,有n-1n−1

條適合於修建賽道的雙向通行的道路,每條道路連線著兩個路口。其中,第ii

條道路連線的兩個路口編號為

a_iai​

和b_ibi

​,該道路的長度為

l_ili​

。借助這

n-1n−1

條道路,從任何乙個路口出發都能到達其他所有的路口。

一條賽道是一組互不相同的道路

e_1,e_2,…,e_ke1

​,e2

​,…,

ek​,滿足可以從某個路口出發,依次經過 道路

e_1,e_2,…,e_ke1

​,e2

​,…,

ek​(每條道路經過一次,不允許調頭)到達另乙個路口。一條賽道的長度等於經過的各道路的長度之和。為保證安全,要求每條道路至多被一條賽道經過。

目前賽道修建的方案尚未確定。你的任務是設計一種賽道修建的方案,使得修建的mm

條賽道中長度最小的賽道長度最大(即mm

條賽道中最短賽道的長度盡可能大)

輸入格式:

輸入檔案第一行包含兩個由空格分隔的正整數

n,mn,m

,分別表示路口數及需要修建的 賽道數。

接下來n-1n−

1行,第ii

行包含三個正整數

a_i,b_i,l_iai

​,bi

​,li

​,表示第ii

條適合於修建賽道的道 路連線的兩個路口編號及道路長度。保證任意兩個路口均可通過這

n-1n−1

條道路相互到達。每行中相鄰兩數之間均由乙個空格分隔。

輸出格式:

輸出共一行,包含乙個整數,表示長度最小的賽道長度的最大值。

【資料規模與約定】

對於所有的資料,

2 ≤ n ≤ 50,0002≤

n≤50

,000

,1 ≤ m ≤ n-11≤

m≤n−

1,1 ≤ a_i,b_i ≤ n1≤

ai​,

bi​≤

n,1 ≤ l_i ≤ 10,0001≤

li​≤

10,0

00。題解:

題意即求乙個k段不相交路徑長度最小值的最大值;

二分這個最大的最小值mid,那麼要求判斷是否有一種方案可以分出》=k條路徑使得權值都》=mid;

樹形dp  : 當做到節點u,要麼u的所有兒子都一定成為了路徑,要麼至多有一條可以向上延伸的路徑;

這樣如果可以在u形成》=mid的路徑,那麼一定比此時不形成路徑往上連更優;

記錄每個點可以往上連的權值val,考慮u的兒子v,u,v之間的邊為e[i]  (**風格,忍受一下。。)

val[v]+e[i].w >= mid 直接統計為一條合法路徑;

否則把左邊存在乙個陣列裡,可以知道要形成路徑只能兩兩配對,排序後二分可以確定最大的對數;

注意未配對的最大的數可能可以替換已配對的權值,找到最大可替換數設定成val[u](注意細節)

複雜度   $o(n log^2 n)$

1 #include2 #include3 #include4 #include5

#define inf 0x3f3f3f3f

6#define rg register

7#define il inline

8#define run(i,l,r) for(int i=l;i<=r;i++)

9using

namespace

std;

10const

int n=50500;11

intn,k,o,hd[n],mid,val[n],sum,p[n];

12 vectorg[n];

13struct edgee[n<<1

];14

void adde(int u,int v,int

w);hd[u]=o++;

16 e[o]=(edge);hd[v]=o++; 17}

18bool check2(int u,int

mid)

24return

true;25

}26void dfs(int u,int

fa)37

int cnt=(int

)g[u].size();

38if(!cnt)return;39

sort(g[u].begin(),g[u].end());

40int l=0,r=cnt>>1;41

while(l

46 sum+=l;

47if((l<<1)==cnt)return;48

for(int i=0;i)

54int

t;55

for(t=cnt-(l<<1);t1]+g[u][p[t]]>=mid;t++)

59 t--;

60return

void(val[u]=g[u][t]);61}

62bool

check1()

66int

main()

77while(l

82 printf("

%d\n

",l);

83 }//

by tkys_austin;

view code

Luogu5021 NOIP2018 賽道修建

luogu5021 noip2018 賽道修建 一棵大小為 n 的樹,邊帶權。選 m 條鏈使得長度和最小的鏈最大。m貪心,二分答案 最小最大?二分 先看部分分 於是可以將兩種做法結合 對於每個節點,往上算貢獻 貪心匹配兩個兒子 至於實現,可以考慮 multiset 也可以排序 二分 時間複雜度 o ...

2018 NOIP備戰計畫

2018 noip目標 1 刷完紫書數論習題 2 聽51nod講座和習題,根據其知識結構來備戰。3 刷完紫書動規 4 初賽前兩個星期左右開始複習 刷紫書動規的時候感覺偏難,進步緩慢。應該自己調低難度 兩個大任務 1 51nod講座 2 按照 演算法競賽高階指南 中動規的分類來刷 線性動規,狀壓動規,...

NOIP 2018 考前須知

day 0day0 day0 來水一發 不要太死板,靈活分配時間,拿到盡量多得分 不失誤就是成功 noip2018 rp 以下by 官方 老師 一.考試進場前。1.早餐一定要吃,不用特別,不要吃得太飽。2.帶手錶一塊 鉛筆或簽字筆一到兩支 三證 學生證 准考證 身份證 二.進場以後 此時離考試開始一...