牛客多校(2020第九場)K The Flee Plan of Groundhog
阿新 • • 發佈:2020-08-09
題目大意:
有一個土撥鼠在節點1,一個橘子在節點n,在t時刻之前土撥鼠向著n走,橘子不動,從t時刻開始,橘子開始抓土撥鼠,土撥鼠開始跑,土撥鼠 1m/s 橘子 2m/s,問還有多長時間橘子才能抓到土撥鼠。
題解:
首先要求的 t 時刻土撥鼠的位置,然後土撥鼠需要逃跑,所以得與 n 點背向而跑,這時候有倆種可能
- 可供土撥鼠跑的路很長,orange抓到它也沒泡到盡頭
- 可供土撥鼠跑的路很短,土撥鼠跑到路的盡頭等待orange來抓它
所以得求土撥鼠能跑的最遠距離, 而且因為背向而跑的,所以他們的相對速度為1m/s,所以orange追上土撥鼠需要花費 (他們 t 時刻相距的距離) 秒。
1 #include<iostream> 2#include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 #include<queue> 6 #include<cstring> 7 #include<cmath> 8 using namespace std; 9 const int N = 1e5 + 5; 10 11 struct node{int to;}; 12 13 vector <node> G[N]; 14 int d_hog[N], orange[N], f[N];15 16 void dfs(int u, int fa, int d[]) { 17 f[u] = fa; 18 for (int i = 0; i < G[u].size(); i++) { 19 int v = G[u][i].to; 20 if (v == fa) continue; 21 d[v] = d[u] + 1; 22 dfs(v, u, d); 23 } 24 } 25 26 void dfs2(int u, int fa, int &maxx) { 27 maxx = max(maxx, orange[u]);28 for (int i = 0; i < G[u].size(); i++) { 29 int v = G[u][i].to; 30 if (v == fa) continue; 31 dfs2(v, u, maxx); 32 } 33 } 34 35 int main() { 36 int n, t; 37 memset(d_hog, 0, sizeof(d_hog)); 38 memset(orange, 0, sizeof(orange)); 39 40 scanf("%d %d", &n, &t); 41 for (int i = 0; i < n - 1; i++) { 42 int u, v; 43 scanf("%d %d", &u, &v); 44 G[u].push_back({v}); 45 G[v].push_back({u}); 46 } 47 48 dfs(n, n, orange); //遍歷organge是希望fa儲存orange的父節點 49 int hog_start = 1; 50 while (t--) { //從1向上尋找t次,找到t秒候hog應該在的位置 51 hog_start = f[hog_start]; 52 } 53 int maxx = 0; 54 dfs2(hog_start, f[hog_start], maxx); //求得hog背離n點而行能走的最大距離(這個距離是以n點位參考點) 55 56 int max_dis = maxx - orange[hog_start]; 57 int bw_dis = orange[hog_start]; //t時刻倆者間的距離 58 if (hog_start == n) printf("0\n"); 59 else if (max_dis >= bw_dis) printf("%d\n", max(1, bw_dis)); //表明土撥鼠是在逃跑的路上被捉到的 60 else printf("%d\n", max(1, (max_dis + bw_dis + 1)/ 2)); //表明土撥鼠是在最遠處等著orange來捉 61 return 0; 62 }