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