NOIP 2015 day2 T3 運輸計畫

2021-08-28 11:45:41 字數 2969 閱讀 7760

time 2018 9 27

題目大意:

資料範圍:

1

<=n

,m

<

=300000

0<=v

al

<

=1000

time limit 1000ms

memory limit 256mb

1<=n,m<=300000\\ 0<=val<=1000\\ \text\\ \text

1<=n

,m<=3

0000

00<=v

al<=1

000time limit 1000ms

memory limit 256mb

思路:

當把最長鏈的某條邊刪除後,所有的鏈將分為兩部分:

一部分為受該刪除邊影響的鏈;

另一部分為不受該刪除邊影響的鏈。

最長鏈鏈長減去所刪邊的邊權;

所刪邊左側不經過所刪邊的最長鏈長;

所刪邊右側不經過所刪邊的最長鏈長。

與最長鏈無公共邊(如上圖中的鏈$9-8-10 $),則不管怎麼刪邊,這些鏈的鏈長並不會改變,可以暫時先存下來。最後直接貢獻到答案中。

與最長鏈有公共邊(如上圖中的鏈6−2

−3−7

6-2-3-7

6−2−3−

7 ),則這就和樹是一條的情況差不多了,唯一不同的是,雖說這些鏈與最長鏈有公共邊,但它們有的邊是突出來的(如上圖中的邊$(6,2),(3,7) $)。但這並不影響計算,因為無論是怎樣刪邊,突出的那部分的值是不會變的,所以可以認為這條鏈是與最長鏈重合的,只是鏈長並不是實際邊的長度,而是原鏈長。

#include

#define max4(x,y,z,w) max(max(x,y),max(z,w))

#define clr(x,y) memset(x,y,sizeof(x))

#define pf printf

#define sf scanf

#define for(x,y,z) for(int x=y;x<=z;x++)

#define dor(x,y,z) for(int x=y;x>=z;x--)

#define for_edge(x,y) for(int x=head[y];~x;x=edge[x].to)

#define read2(x,y) read(x),read(y)

#define read3(x,y,z) read(x),read(y),read(z)

#define db double

#define ll long long

using

namespace std;

const

int maxn=

3e5+5;

const

int p=(1

<<16)

-1;void

read

(int

&x)struct edgeedge[maxn<<1]

;int tot,head[maxn]

;void

add(

int x,

int y,

int z)

; head[x]

=tot;

}int n,m;

int dep[maxn]

,son[maxn]

,sz[maxn]

,top[maxn]

,dis[maxn]

,fa[maxn]

;void

dfs_init

(int u,

int f)

}void

dfs_top

(int u,

int tp)

}int

lca(

int x,

int y)

return dep[x]

>dep[y]

?y:x;

}struct node

}a[maxn]

;int eg[maxn]

;void

dfs(

int u,

int f)

}int f[maxn]

;bool mark[maxn]

;void

dfs_link

(int u,

int f)

}void

mark

(int s,

int e)

while

(s!=e);}

int v[2]

[maxn]

;voidup(

int s,

int e)

while

(s!=e);}

void

down

(int s,

int e)

while

(s!=e);}

int s,e,mx;

void

sort()

}int

main()

tot=0;

dfs_init(1

,0);

dfs_top(1

,1);

for(i,

1,m)a[i].rd

();sort()

;if(s==e)

dfs(s,0)

;mark

(s,e)

;int tmp=0;

for(i,

1,m)}up

(s,e)

;//處理字首

down

(s,e)

;//處理字尾

int ans=

2e9;

dowhile

(e!=s);pf

("%d"

,ans)

;}

有一類資料為m=1且該鏈的起點與重點求和,需要特判

NOIP2015Day2T3 運輸計畫

題解 二分答案。假設列舉到答案是xxx。找出所有長度大於x xx的鏈,那麼這些鏈上必須要放蟲洞,而且必須放在一條所有鏈都經過的邊上,否則必然有一條鏈的長度是大於x xx的。這個直接差分就能求出所有鏈都經過的邊,並且把最長的那條改為蟲洞,看看所有邊是否合法,則可判斷x xx是否可行。應該不是很難吧。比...

NOIP 2015 Day2 T3 運輸計畫

公元 2044 年,人類進入了宇宙紀元。公元 2044 年,人類進入了宇宙紀元。l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物流飛船需要從 u i 號...

noip2015day1t2 資訊傳遞

把每個同學看成乙個點,傳遞關係看成一條邊,點數等於邊數,因此圖由若干個環或環鏈復合邊數等於點數的東西組成,不存在孤立鏈。在圖上,傳遞一輪後,每個點掌握沿邊前乙個點的資訊,傳遞x輪後,任意乙個點恰好掌握沿邊反向前進x條邊的路徑上的所有點的資訊,要聽到自己的資訊,也就是在環上走一圈。這樣就把題目抽象為找...