洛谷P1084 疫情控制

2022-03-17 14:51:32 字數 1293 閱讀 7723

題目

細節比較多的二分+跟lca倍增差不多的思想

首先有這樣乙個貪心思路,深度越低的檢查點越好,而最長時間和深度具有單調性,即給定時間越長,每個軍隊能向更淺的地方放置檢查點。因此可以考慮二分時間,然後判斷軍隊是否可以放置在控制疫情的地方。

#include #define n 1001001

using namespace std;

struct edg e[n];

struct tem a[n], b[n];

int n, m, cnt, lin[n], vis[n], vis2[n], army[n], dep[n], fa[n][19], dis[n][19];//fa[i][j]表示軍隊向上跳j次所到達的位置,dis表示此時所用的時間。

//vis表示該點包括的葉子節點是否被完全覆蓋

bool cmp(tem x, tem y)

inline void add(int f, int t, int l)

void dfs(int now, int f)

}void bf(int now)//判斷該點的所有葉子節點是否全都被覆蓋

if (b1 && b2 && now != 1)

vis[now] = 1;

}bool check(int mid)//使每個軍隊都盡可能的往上跳,直到距離比mid大才停止。

} bf(1);

for (int i = lin[1]; i; i = e[i].nex)//列舉深度為2的點

sort(a + 1, a + 1 + tnt1, cmp);//a的len是剩餘的時間

sort(b + 1, b + 1 + tnt2, cmp);//b的len是需要的時間, 他們的時間相加

int j = 1;

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

if (j > tnt2)

return 1;

else

return 0;

}inline void init()

scanf("%d", &m);

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

scanf("%d", &army[i]);

dfs(1, 0);

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

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

}int main()

printf("%d", ans);

return 0;

}

洛谷P1084 (疫情控制)

h 國有 n 個城市,這 n 個城市用 n 1 條雙向道路相互連通構成一棵樹,1 號城市是首都,也是樹中的根節點。h 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市 的每一條路徑上都至少有乙...

P1084 疫情控制

p1084 疫情控制 好像二分 倍增 樹上差分是比較熱門的考尻點 會結合在一起考,難度比較大,需要多加練習。現在在解決noip最後的幾道大題,很鵝心。也沒有人做嚮導,很難受qwq 首先這是一棵樹,乙個軍隊肯定是越往上走越好。有大佬說過,對於這種提點的題,要是用倍增 要是時間最短,就是要是用時最長的軍...

P1084 疫情控制

p1084 傳送門 感覺noip t3也是有點東西的 將該題轉化為最大值最小問題後想到二分答案 接下來考慮 check 時如何貪心 由於除了在根節點所有軍隊都只往上跳明顯採取倍增的方式 記錄所有能到達根節點的軍隊和根節點下所有未被封死的子樹 將兩個序列從小到大排序後貪心匹配即可判斷 注意 在判斷封死...