NOIP2015 Day2 運輸計畫

2021-08-17 09:53:32 字數 2667 閱讀 4245

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

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

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

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

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

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

/輸入檔名為transport.in。/

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

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

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

/輸出檔名為transport.out。/

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

6 3

1 2 3

1 6 4

3 1 7

4 3 6

3 5 5

3 6

2 5

4 5輸入輸出樣例1說明:

將第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。

由題意,使一條邊長度變為零,要使最長距離盡可能短。

暴力列舉顯然不行。求「最大的最小」,可用二分答案。

每次二分乙個長度x,判斷是否能讓所有路徑長度不超過x。

如何判斷?

列舉所有長度大於x的路徑,將路徑上每條邊權值加一。假設開始有k 條路徑長度大於x, 顯然只有將權值為k 的一條邊改為蟲洞,才有可能讓所有路徑長度不超過x 。

至於如何快速修改邊權,可用樹上差分。

具體見**。

#include 

#include

#include

#include

#include

using namespace std;

const int q=666666,p=333333;

int nn[q],e[q],v[q],last[p]=,dis[p][21],n,s,f[p][21],dep[p],tot=0,bbq[p],m;

bool ch[p]=;

struct dtq[p];

void add(int

x,int

y,int z)

void search(intx)}

void lca(int

x,int

y,int &temp,int &dian)

for(i=s;i>=0;--i)

if(f[x][i]!=f[y][i])

temp+=dis[x][i]+dis[y][i],x=f[x][i],y=f[y][i];

temp+=dis[x][0]+dis[y][0];

dian=f[x][0];

return;

}void mod_root(intx)}

bool hac(int

x) mod_root(1);

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

if(bbq[i]==temp&&dis[i][0]>=ha)return true;

return false;

}int find(int l,int r)

return l;

}int tmain()

dep[1]=1,f[1][0]=1;

search(1);

for(j=1;j<=s;j++)

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

f[i][j]=f[f[i][j-1]][j-1],dis[i][j]=dis[i][j-1]+dis[f[i][j-1]][j-1];

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

printf("%d",find(0,300000000));

return

0;}

NOIP 2015 Day2 解題報告(全面)

stone.cpp c pas 一年一度的 跳石頭 比賽又要開始了!這項比賽將在一條筆直的河道中進行,河道中分布著一些巨大岩石。組委會已經選擇好了兩塊岩石作為比賽起點和終點。在起點和終點之間,有 n 塊岩石 不含起點和終點的岩石 在比賽過程中,選手們將從起點出發,每一步跳向相鄰的岩石,直至到達終點。...

NOIP2015提高組Day2T3 運輸計畫

傳送門 tips 如果兩個點的lca會被反覆用到,就可以拿乙個陣列存下來,避免反覆計算 analysis 又是一道好喵喵喵妙的題啊!樹上差分太棒了,簡直太厲害 不過首先我們得看出來這是一道二分可以解決的問題 然後問題就變成了怎麼check 看看gsj大佬怎麼說吧 code 注意常數因子帶來的程式效率...

NOIP2015提高組Day2T3 運輸計畫

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