Bzoj4326 運輸計畫

2021-07-26 19:01:26 字數 3237 閱讀 5195

time limit: 30 sec  

memory limit: 128 mb

submit: 1091  

solved: 696 [

submit][

status][

discuss]

公元 2044 年,人類進入了宇宙紀元。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。資料保證 1≤ai,bi≤n 且 0≤ti≤1000。接下來 m 行描述運輸計畫的情況,其中第 j 行包含兩個正整數 uj 和 vj,表示第 j 個運輸計畫是從 uj 號星球飛往 vj號星球。資料保證 1≤ui,vi≤n

輸出檔案只包含乙個整數,表示小 p 的物流公司完成階段性工作所需要的最短時間。

6 31 2 3

1 6 4

3 1 7

4 3 6

3 5 5

3 62 5

4 511

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

noip2015的day2 t3,還是有一定難度的,而且編寫上雖然算不上是碼農題,但是對模板的掌握還是要很熟練的。演算法的話是用的倍增+二分答案(帶特技?),然後會打的話樹剖應該也可以玩。我的思路是這樣子的:

首先那一大堆陣列的意思:head,to,next,val這個存邊。grand和depth是lca時所用到的深度和祖先。done的話也是lca中用,kth是第i個數字的值,dis記錄到根的距離(便於差分),tmp記錄某點出現的次數,而prev記錄乙個點前驅邊的權值。que結構體記錄對於每組詢問的兩端,距離,與lca...呼...就這樣。

做法的話首先預處理lca、距離等之後把每一組詢問記作一條邊,記錄下此邊的距離(可以用dis[u]+dis[v]-2*dis[lca(u,v)]求出)。之後開始二分答案(邊界設定的話建議每加一條邊tot+=v[i],二分右邊界為tot)。而對於每一次二分的值(這裡二分時間(也可以叫價值吧)),把所有時間大於此答案的邊記錄(即cnt++,記錄下左右端點。)然後把左右端點的路徑跑一邊(具體就是維護tmp陣列)。之後開始判斷,如果有一條邊的tmp == cnt,說明在所有超界的方案中都經過了此邊。這時候,如果此邊的價值被減去後所有的答案都不會超界,那麼這個答案是可用的,開始往左邊二分。如果不行的話就往右邊二分。最後就可以得出答案。

#include #include #include using namespace std;

const int maxx = 300000 + 100;

const int maxm = 300000 + 50;

int head[maxx],next[maxx<<1],to[maxx<<1],val[maxx<<1];

int grand[maxx][20+2],depth[maxx],tmp[maxx],dis[maxx],prev[maxx],kth[maxx];

bool done[maxx];

int n,m,root,x,y,z,num,t,size,tot,ans;

templatet chkmax(const t &a,const t &b)

struct queq[maxm];

inline int read()

while(c>='0'&&c<='9')

return x*f;

}void add(int x,int y,int z)

void dfs(int x)

return x == y? x : grand[x][0];

}bool check(int x)

} if(!cnt) return true;

for(int i=n;i>1;i--)

tmp[grand[kth[i]][0]] += tmp[kth[i]];

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

if(tmp[i]==cnt && prev[i]>=dist)

return true;

return false;

}int work()

return ans;

}int main(){

n = read();m = read();

for(int i=1;i然後...在bzoj上是可以a的,但是codevs的話乙個點始終過不了,noip官方資料的話也能過。大常數始終不知道優化,希望有神犇能夠幫幫我qwq。

雖然沒這麼**...反正就這種感覺...

bzoj 4326運輸計畫

二分 樹上倍增 先放乙個用倍增法求解樹上距離的方法,我最開始又犯了那個錯誤 這段我最開始上下又寫反了。記性他就是不進腦子啊。再錯我tm是dog include using namespace std typedef long long ll typedef int lint typedef pair...

NOIP2015 運輸計畫(bzoj4326)

time limit 30 sec memory limit 128 mb submit 886 solved 574 submit status discuss 公元 2044 年,人類進入了宇宙紀元。l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連...

bzoj4326 NOIP2015 運輸計畫

題目 遙想當年初三參加時,想到了二分,想到了lca,就沒想到如何判斷,然後差20分省一23333.首先答案顯然滿足二分性質,之後判定答案。我們把長度超過k的路徑找到,找出它們公共邊中最長的,把它變為0,看是否可行。如何,找公共邊?樹鏈剖分當然可以,但太複雜了。可以把兩端標記加1,lca標記減2,之後...