noip 2015 運輸計畫 (lca 二分)

2022-05-15 22:41:45 字數 1538 閱讀 7887

/*

95 最後乙個點t了 qian lv ji qiong 了

沒學過樹剖 聽chx聽xzc說的神奇的方法 orz

首先求出每個計畫的路徑長度 這裡寫的倍增

然後二分答案

對於每個ans 統計>他的路徑條數 tot 並維護最大差值 dec

並且對於每條不合法的路徑維護每個點的經過次數

然後列舉點 如果經過次數==tot說明每一條不合法的都經過他

然後嘗試把它建成蟲洞 如果他對應邊的權值》=dec 那麼我們刪掉它ans就合法了

關鍵是統計每個點在非法路徑中的經過次數 :

維護sum陣列 對於每個非法的路徑起點a b lca(a,b)==s sum[a]++ sum[b]++ sum[s]-=2

這樣網上更新的話 經過的點的sum值都變成1 祖先s的變成0

這樣就實現了sum陣列的維護

*/#include

#include

#include

#include

#define maxn 300100

using

namespace

std;

intn,m,num,head[maxn],ans,inf;

int fa[maxn][30

],dep[maxn],dis[maxn],sum[maxn],edge[maxn];

struct

node

e[maxn*2

];struct

anslca[maxn];

intinit()

returnx;}

void add(int

from,int to,int

dis)

void dfs(int now,int

from,int c,int

dis)

}void

get_fa()

int get_same(int a,int

t)int lca(int a,int

b)

return fa[a][0];}

void

init()

dfs(

1,1,0,0

); get_fa();

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

}void up_sum(int now,int

from)}

int judge(int

x) up_sum(

1,1);//

更新sum陣列

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

if(tot==sum[i]&&e[edge[i]].t>=dec)//

刪掉edge[i]這條邊之後答案合法了

return1;

return0;

}void solve()//

二分答案

else l=mid+1

; }

}void

printf()

intmain()

NOIp 2015 運輸計畫 LCA

問題大意 有n個星球與n 1條雙向邊,每條邊有時間ti,有m個從vi到ui的運輸計畫。允許你將一條邊的時間降為0。同時開始所有的計畫,問最小要多少時間完成計畫。輸入輸出格式 輸入格式 輸入檔名為 transport.in。第一行包括兩個正整數 n m,表示 l 國中星球的數量及小 p 公司預接的運輸...

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...