公元20442044 年,人類進入了宇宙紀元。
l 國有 nn 個星球,還有 n-1n−1 條雙向航道,每條航道建立在兩個星球之間,這 n-1n−1 條航道連通了 ll 國的所有星球。
小 p 掌管一家物流公司, 該公司有很多個運輸計畫,每個運輸計畫形如:有一艘物流飛船需要從 u_iu**i 號星球沿最快的宇航路徑飛行到 v_iv**i 號星球去。顯然,飛船駛過一條航道是需要時間的,對於航道 jj,任意飛船駛過它所花費的時間為 t_jt**j,並且任意兩艘飛船之間不會產生任何干擾。
為了鼓勵科技創新, ll 國國王同意小 pp 的物流公司參與 ll 國的航道建設,即允許小pp 把某一條航道改造成蟲洞,飛船駛過蟲洞不消耗時間。
在蟲洞的建設完成前小 p 的物流公司就預接了 mm 個運輸計畫。在蟲洞建設完成後,這 mm 個運輸計畫會同時開始,所有飛船一起出發。當這 mm 個運輸計畫都完成時,小 pp 的物流公司的階段性工作就完成了。
如果小 pp 可以自由選擇將哪一條航道改造成蟲洞, 試求出小 pp 的物流公司完成階段性工作所需要的最短時間是多少?
這題還是算比較簡單的,暴力也能打滿分。暴力一點的,樹剖一條條試著刪m條路徑中的最長路徑上的邊就完事了。
題意很簡單:給定帶權樹,將樹中某條邊的權值替換為0,並使替換後的最長路徑最短。
看到最小化最大值,首先想到二分答案。首先我們要做一些基本的事情,這種在樹上給定一對對起點終點的題目,肯定每對起點終點對應的路徑是唯一的,我們先求出這些路徑,即求lca。
現在考慮如何二分,現在我們要解決的問題肯定就是在替換哪一條邊、能不能替換的問題上了。顯然,如果要使得所有起點終點對應的路徑長度小於二分出的值,那麼我們只需考慮那些比二分出的值大的路徑。我們來考察這些路徑,發現由於我們只能替換一條邊,那麼這條要替換的邊就一定得是所有比二分出的值大的路徑的公共邊,否則至少要替換兩條邊才能使得當前二分情況成立。
那麼如何判斷所有比二分出的值大的路徑有公共邊呢?這裡是難點。不難想出解決辦法,就是統計所有比二分出的值大的路徑的經過的邊,做路徑覆蓋,如果最後某一條邊被覆蓋的次數與比二分出的值大的路徑條數相等的話,這條邊就是公共邊。為了加快計算速度,我們可以使用樹上差分技巧。
又如何判斷當前二分情況是否成立呢?首先,如果我們沒有找到公共邊,那麼當前情況一定不成立,其至少需要替換兩條邊。如果我們找到了一條以上的公共邊,貪心的思想,一定是替換這些公共邊中最長的那一條使得最長路徑最短,而如果我們替換掉這最長的一條後最長路徑仍然不滿足當前二分出來的值,就不合法。
分析到這裡,我們發現我們需要以下資訊:
這題也沒什麼好注意的細節問題,二分寫好了就沒事。
#include#include#include#include#include#include#include#include#include#include#define n 300010
#define ri register int
using namespace std;
inline int read()
while(c>='0'&&c<='9')
return x*f;
}int n,m,f[31][n],t,dep[n],d[n],c[n];
struct nodes[n];
struct recg[n<<1];
int head[n],tot,up[n];
inline void add(int x,int y,int val)
inline void init()
inline void dfs(int x,int fa)
}inline bool check(int x)
if(!cnt) return 1;
dfs(1,-1);
for(ri i=1;i<=n;++i)
if(c[i]==cnt) maxn=max(maxn,up[i]);
return maxx-maxn<=x;
}int main()
printf("%d\n",l);
return 0;
}
P2680 運輸計畫
好久沒更新部落格了,更一篇吧 qwq 傳送門要求我們讓路徑的最大時間最小 這很二分答案 可以二分答案 mid 然後想辦法 o n 去檢查答案是否合法 可以記錄出路徑長度大於 mid 的路徑,盡量在這些路徑的交集部分建造黑洞 顯而易見 我們可以用邊差分 diff i 來記錄這條邊被幾個大於 mid 的...
P2680 運輸計畫
公元 2044 年,人類進入了宇宙紀元。l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物 流飛船需要從 ui 號星球沿最快的宇航路徑飛行到 vi 號星球...
P2680 運輸計畫
最短的最長鏈,二分答案,然後進行邊差分 大常數選手表示倍增lca卡不過去啊 只好面向資料點變成了一下qaq 學會tarjan求lca再來修吧 或許學會樹剖後?luogu judger enable o2 includeusing namespace std struct nodeeg 300200 ...