NOIP2015提高組Day2T3 運輸計畫

2021-10-16 22:50:57 字數 3240 閱讀 8430

公元2044

2044

2044

年,人類進入了宇宙紀元。

l 國有 n

nn個星球,還有 n−1

n-1n−

1 條雙向航道,每條航道建立在兩個星球之間,這$ n−1$ 條航道連通了 l 國的所有星球。

小 p 掌管一家物流公司, 該公司有很多個運輸計畫,每個運輸計畫形如:有一艘物流飛船需要從 u

iu_i

ui​ 號星球沿最快的宇航路徑飛行到 v

iv_i

vi​ 號星球去。顯然,飛船駛過一條航道是需要時間的,對於航道 j

jj,任意飛船駛過它所花費的時間為 t

jt_j

tj​,並且任意兩艘飛船之間不會產生任何干擾。

為了鼓勵科技創新, l 國國王同意小 p 的物流公司參與 l 國的航道建設,即允許小 p 把某一條航道改造成蟲洞,飛船駛過蟲洞不消耗時間。

在蟲洞的建設完成前小 p 的物流公司就預接了 m

mm 個運輸計畫。在蟲洞建設完成後,這m

mm 個運輸計畫會同時開始,所有飛船一起出發。當這 m

mm 個運輸計畫都完成時,小 p 的物流公司的階段性工作就完成了。

如果小 p 可以自由選擇將哪一條航道改造成蟲洞, 試求出小 p 的物流公司完成階段性工作所需要的最短時間是多少?

1 ≤n

,m

≤300000

1\le n,m\le 300000

1≤n,m≤

3000

00 1≤a

i,bi

,≤

n1\le a_i,b_i,\le n

1≤ai​,

bi​,

≤n,0 ≤t

i≤

1000

0\le t_i\le1000

0≤ti​≤

1000

,1 ≤u

i,vi

≤n

1\le u_i,v_i\le n

1≤ui​,

vi​≤

n 二分答案+lca+樹上差分

首先是樹上路徑問題,可以想到跟lca

\text

lca有關係

這裡建議使用樹鏈剖分求lca

\text

lca,倍增可能被卡

ps:講樹鏈剖分的乙個優秀部落格:樹鏈剖分

求完lca

\text

lca的時候可以順便統計路徑長度:dis

=dee

p[x]

+dee

p[y]

−2×d

eep[

lca]

dis=deep[x]+deep[y]-2\times deep[lca]

dis=de

ep[x

]+de

ep[y

]−2×

deep

[lca

] 看到最大值最小,容易想到二分答案

可以證明如果t1t1

t1的時間可以完成,那麼t2t2

t2也可以完成(t

2>t1

t2>t1

t2>t1

)因此答案具有單調性,可以二分答案

那麼現在就需要che

ck(m

id

)check(mid)

check(

mid)

列舉路徑長度比mid

midmi

d大的,用樹上差分,給路徑左右兩端+1,lca

lcalc

a-2(邊差分)

注意這裡我們先將邊權轉移為點權,那麼除了根節點每個點都有點權

然後如果找到乙個點使得最長邊減去這個點的點權(其實也是它與它父親之間那條邊的邊權)>=m

id

>=mid

>=m

id,且這些路徑的長度都比mid

midmi

d大,就說明mid

midmi

d可行否則如果找不到,就不可行

如果被卡了,可以採用dfs

dfsdf

s序優化

#include

#include

#include

#define n 300005

using

namespace std;

struct node

a[n<<1]

;struct ques

edge[n]

;int n,m,x,y,z,tot,cnt,l,r,f[n]

,deep[n]

,size[n]

,id[n]

,val[n]

,dis[n]

,son[n]

,top[n]

,cha[n]

;void

add(

int x,

int y,

int z)

void

dfs1

(int now,

int fa)

}void

dfs2

(int now,

int topf)

}int

lca(

int x,

int y)

return deep[x]

<=deep[y]

?x:y;

}//以上是樹剖基操

bool

check

(int mid)

for(

int i=n;i>=1;

--i)

return

false;}

inttwo_point

(int left,

int right)

return res;

}int

main()

dfs1(1

,0);

dfs2(1

,1);

for(

int i=

1;i<=m;

++i)

printf

("%d\n"

,two_point

(r-l,r+1)

);//二分答案

fclose

(stdin);

fclose

(stdout);

return0;

}

如果覺得我講的有點不清楚,可以去參考這位大佬的部落格

感謝閱讀qaq

NOIP2015提高組Day2 運輸計畫

其實題目說那麼多,一句話就是 給定一棵帶權樹與m mm條路徑,你可以使一條樹上的邊的權值變為0,問你m mm條路徑的長度的最大值最小是多少。這道題讓我想到了貨車運輸這道題,但是更難,但方法可以借鑑。因為這是最大值最小問題,很顯然可以二分答案。那這個二分判斷怎麼打呢?我們如果遇到某條邊,所有超時的邊 ...

Noip2015提高組總結

總體而言noip還行吧,每天前兩題都穩穩地,但是最後一題做得不好。day1,看完題目後,第一題簽到,第二題很直觀想出來了,又畫了個圖驗證了一下,tarjan雖然可能爆棧,但人工棧就沒問題了。第三題認為是dp一類的東西。畢竟是第一次提高組,還是挺緊張的,一二題打得特別仔細特別慢,對拍,肉眼查錯,搞了接...

NOIP2015提高組解析

題目見此 day1 神奇的幻方 裸裸的模擬 其實也可以發現規律 i 1在i的右上方,如果已經有數了,就填在i的下方 include includeusing namespace std int a 50 50 int nx,ny,n int main else elseelse a tx ty i ...