NOIP2015 運輸計畫

2022-08-20 23:27:14 字數 1355 閱讀 5449

here

這題題意簡要來講就是:給定樹上許多條鏈,求刪掉一條邊後,所有鏈的最大值最小是多少

首先,各個點對間的距離可以用lca求出,主要問題是怎樣考慮這個刪邊,刪除一條邊後會有以下兩種情況:

取得最大值的點對間經過該邊

取得最大值的點對間不經過該邊

這樣就很難處理了,我們可以考慮二分答案,只考慮所有距離大於該值的點對,最後判斷刪邊後所有大於該值的點對是否小於該值即可,刪邊當然是刪掉所有大於該值的點對的公共邊中的最大值啦。如何記錄最大公共邊?直接樹上差分最後跑一邊dfs就好~(不過最後吐槽一句:這題太卡常了,我現在luogu還有乙個點被卡)

#include#include#include#includeusing namespace std;

int read()

while(ch>='0'&&ch<='9')

return x * f;

}const int m = 300030;

const int n = 300030;

struct nodeedge[m << 1], e[m];

int head[n], num;

void build(int from, int to, int dis)

bool cmp(node a, node b)

int d[n], f[n][20], dis[n];

void dfs(int u, int fa)

}int lca(int u, int v)

int n, m, val[n];

void dfs2(int u, int fa)

}bool check(int now)

dfs2(1, 0);

int nowdis = 0;

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

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

return 1;

}int main()

d[1] = 1; dfs(1, 0);

for(int j=1; j<=18; j++)

for(int i=1; i<=n; i++) f[i][j] = f[f[i][j-1]][j-1];

int max = 0;

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

int l = 0, r = max, ans = 0;

while(l <= r)

else l = mid + 1;

}cout << ans;

return 0;

}

對於這一題,二分答案的原因是我們並不確定也不能直接算出最終的答案(因為有不同的情況),通過二分答案我們可以確定乙個界限,方便我們求解。

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

noip 2015 運輸計畫

去題面的傳送門 題目的意思是 求將一棵樹上的任意一條邊權賦值為0時,所有航線的最長長度的最小值 想到二分答案 如何驗證?既然我們二分的答案是最長路線,也就是說,在將一條邊權賦值為0之後,所有的路線長度應該都小於等於mid。但是只能刪掉一條邊,所以這條邊是所有刪邊之前長度小於mid的路線的交邊。問題轉...