NOIP2015運輸計畫(二分答案)

2022-05-09 14:34:29 字數 4243 閱讀 4509

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

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

小p掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如:有一艘物流飛船需要從ui號星球沿最快的宇航路徑飛行到vi號星球去。顯然,飛船駛過一條航道是需要時間的,對於航道j,任意飛船駛過它所花費的時間為tj,並且任意兩艘飛船之間不會產生任何干擾。

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

在蟲洞的建設完成前小p的物流公司就預接了m個運輸計畫。在蟲洞建設完成後,這m個運輸計畫會同時開始,所有飛船一起出發。當這m個運輸計畫都完成時,小p的物流公司的階段性工作就完成了。

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

第一行包括兩個正整數n、m,表示l國中星球的數量及小p公司預接的運輸計畫的數量,星球從1到n編號。

接下來n-1行描述航道的建設情況,其中第i行包含三個整數ai, bi和ti,表示第i條雙向航道修建在ai與bi兩個星球之間,任意飛船駛過它所花費的時間為ti。

接下來m行描述運輸計畫的情況,其中第j行包含兩個正整數uj和vj,表示第j個運輸計畫是從uj號星球飛往vj號星球。

共1行,包含1個整數,表示小p的物流公司完成階段性工作所需要的最短時間。

input

6 3

1 2 3

1 6 4

3 1 7

4 3 6

3 5 5

3 62 5

4 5

output
11
將第1條航道改造成蟲洞:則三個計畫耗時分別為:11、12、11,故需要花費的時間為12。

將第2條航道改造成蟲洞:則三個計畫耗時分別為:7、15、11,故需要花費的時間為15。

將第3條航道改造成蟲洞:則三個計畫耗時分別為:4、8、11,故需要花費的時間為11。

將第4條航道改造成蟲洞:則三個計畫耗時分別為:11、15、5,故需要花費的時間為15。

將第5條航道改造成蟲洞:則三個計畫耗時分別為:11、10、6,故需要花費的時間為11。

故將第3條或第5條航道改造成蟲洞均可使得完成階段性工作的耗時最短,需要花費的時間為11。

首先考慮一下暴力,在n,m都小於3000時,先將兩點間的邊權值轉化為深度較大的點的權值,利用樸素lca求出兩點間的耗費時間,再列舉刪去哪一點列舉m中答案,更新即可

時間複雜度o(n*m),期望得分60分

1 #include2 #include3 #include4

using

namespace

std;

5 typedef long

long

lnt;

6struct

pntp[1000000

];14

struct

ente[1000000

];19

intcnt;

20int

n,m;

21 lnt ans=0x7f7f7f7f7f7f7f7fll;

22int u[300001

];23

int v[300001

];24

int tf[300001

];25

int hv[3005][3005

];26

void ade(int f,int

t,lnt y)

2734

void dfs(int x,int

f)3546}

47return;48

}49intmain()

5060 dfs(1,1

);61

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

6265

if(m==1)66

79if(x==y)

8084

while(x!=y)

8593 printf("

%lld\n

",mtmp-mins);

94return0;

95}96for(int i=1;i<=m;i++)

97109

if(x==y)

110114

while(x!=y)

115123 tf[i]=mtmp;

124}

125for(int i=2;i<=n;i++)

126132 ans=min(ans,maxs);

133}

134 printf("

%lld\n

",ans);

135return0;

136 }

二分答案+樹上打差分

將計畫排序。

1 #include2 #include3 #include4

using

namespace

std;

5 typedef long

long

lnt;

6struct

pntp[1000000

];14

struct

ente[1000000

];19

struct

qntq[10000000

];24

intn,m;

25int

cnt;

26int

ont;

27int

lsd;

28int

top;

29int old[20][1000000

];30

int lg[2000000

];31

int lns[2000000

];32

int lfs[2000000

];33

bool

cmp(qnt x,qnt y)

3437

void ade(int f,int

t,lnt v)

3845

void dfs_build(int x,int

f)4662}

63if

(flag)

6467}68

void tr_dfs(int x,int

f)6978}

79return;80

}81int rmaxs(int x,int

y)82

85int lca(int x,int

y)86

92int ccl(int

agc)

93105 tr_dfs(1,1

);106 lnt ans=0

;107

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

108113

}114 lns[x]=ans;

115return

ans;

116}

117int

main()

118128

for(int i=2;i<=3*n;i++)

129132 dfs_build(1,1

);133

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

134for(int j=1;j+(1

<1

<=ont;j++)

135 old[i][j]=rmaxs(old[i-1][j],old[i-1][j+(1

<1

)]);

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

137141 sort(q+1,q+m+1

,cmp);

142int l=0

;143

int r=q[1

].dtc;

144int

ans;

145while(l<=r)

146153

}154 printf("

%d\n

",ans);

155return0;

156 }

noip 2015 運輸計畫 (lca 二分)

95 最後乙個點t了 qian lv ji qiong 了 沒學過樹剖 聽chx聽xzc說的神奇的方法 orz 首先求出每個計畫的路徑長度 這裡寫的倍增 然後二分答案 對於每個ans 統計 他的路徑條數 tot 並維護最大差值 dec 並且對於每條不合法的路徑維護每個點的經過次數 然後列舉點 如果經...

noip2015 運輸計畫

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

NOIP2015 運輸計畫

題目鏈結 codevs 4632 題目大意 在一棵 n 節點樹上,有 m個運輸計畫 從ai 到 bi n,m 300000 問 把哪一條樹邊的權值變為0,可以使所有運輸計畫的最大距離最小,輸出這個最大距離的最小值。分析 0.首先要會lca和樹上差分。1.顯然,這道題要求樹上兩點之間的距離,所以要寫l...