最小賽道長度的最大值,很明顯的二分答案,即求出賽道長度均大於等於\(mid\)時最多賽道條數,判斷是否大於\(m\)即可。
但是如何求出最多的條數?我們發現這是一顆樹,可以用一種子樹遞迴計算的思路,算出兒子節點的答案來算出父親節點的答案,每次我們只管算出當前子樹,再將一些情況上傳到父親,這是乙個很妙的思路。
具體如何計算當前子樹最大賽道數就咕咕咕了,主要是上面的思想
#include #include #include #define maxn 50005
using namespace std;
int head[maxn],vv[maxn*2],ww[maxn*2],nxt[maxn*2],tot;
inline void add_edge(int u, int v, int w)
multiset s[maxn];
multiset ::iterator iter;
int n,m,cnt;
int solve(int u, int fa, int k)
int res=0;
while(!s[u].empty())else
}return res;
}bool check(int k)
int main()
int ans=0;
while(l<=r)
printf("%d", ans);
return 0;
}
P5021 賽道修建 貪心 二分
c 城將要舉辦一系列的賽車比賽。在比賽前,需要在城內修建 mm 條賽道。c 城一共有 nn 個路口,這些路口編號為 1,2,n1,2,n,有 n 1n 1 條適合於修建賽道的雙向通行的道路,每條道路連線著兩個路口。其中,第 ii 條道路連線的兩個路口編號為 a ia i 和 b ib i,該道路的長...
NOIP2018 賽道修建(樹形dp 二分)
弱雞萌新2018年難忘的騙分之旅 花了2個小時騙分2333 從n個點構成的的樹中取出m條邊不重複路徑,使得最小的路徑最長 由於沒有乙個確定的限制且問題具有單調性,首先肯定想到二分答案,設該數為x,那麼需要找出長度大於等於x的路徑條數 對於乙個子樹i,考慮它的貢獻,分為兩種 i子樹中選一條或兩條鏈,使...
二分查詢與二分答案
主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...