傳送門
要最長鏈的長度最短,一秒想到二分,因為如果對於某個長度滿足改掉一邊的邊權後能使得所有鏈長度不超過該長度,則所有比他長的長度也滿足.
二分最終答案.我們要使得原來長度大於二分的\(mid\)的鏈刪邊後小於\(mid\),所以要找出一條最長的,被所有長度大於\(mid\)的鏈包含的邊,使得最長鏈長度減去這條邊長度不超過\(mid\)
用樹剖求出\(lca\),用來求每條鏈的長度.我們還要在check的時候知道每條邊被哪些長度大於\(mid\)的鏈覆蓋,使用差分即可
// luogu-judger-enable-o2
#include#define ll long long
#define il inline
#define re register
#define db double
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int n=300000+10;
il ll rd()
while(ch>='0'&&ch<='9')
return x*w;
}int to[n<<2],nt[n<<2],w[n<<2],hd[n],tot=1;
il void add(int x,int y,int z)
int n,sz[n],de[n],hc[n],top[n],dis[n],fae[n],fa[n],a[n],m,q[n][3],len[n],maxl,ma,nm;
il void dfs1(int x,int ffa)
}il void dfs2(int x,int ffa)
for(re int i=hd[x];i;i=nt[i])
}il void dd(int x,int ffa)
}il bool check(int mid)
int main()
printf("%d\n",ans);
return 0;
}
Luogu P2680運輸計畫(樹上差分 二分)
題目鏈結 總體思路 怎麼說呢 是個暴力吧 首先用倍增預處理出每條路徑的長度。然後按長度把路徑排序。然後二分答案。對於當前答案mid檢驗,怎麼檢驗呢?首先差分把所有長度比mid大的鏈上除了lca之外的所有點權 1。dfs求出每個點的點權,順便記下有多少點是被所有路徑經過的。對於這些點,如果有乙個點使得...
P2680 運輸計畫
好久沒更新部落格了,更一篇吧 qwq 傳送門要求我們讓路徑的最大時間最小 這很二分答案 可以二分答案 mid 然後想辦法 o n 去檢查答案是否合法 可以記錄出路徑長度大於 mid 的路徑,盡量在這些路徑的交集部分建造黑洞 顯而易見 我們可以用邊差分 diff i 來記錄這條邊被幾個大於 mid 的...
P2680 運輸計畫
公元 2044 年,人類進入了宇宙紀元。l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物 流飛船需要從 ui 號星球沿最快的宇航路徑飛行到 vi 號星球...