NOIP2012 疫情控制 貪心 二分 倍增

2021-08-25 19:44:30 字數 2266 閱讀 8362

一道很全(du)面(liu)的題

題目大意:給定一棵樹,用最少的時間封住這棵樹。

題解:

首先可以很容易發現乙個條件:軍隊在走的時候都要盡量往上走,但不到根節點。因為越靠近根節點的點,控制的葉子節點越多。不過暴力是肯定會超時的,用倍增優化。

題目求的是最長移動時間軍隊的最短時間,想到二分答案。

但是還有這樣一種情況:一支軍隊到達首都之後,又到達了另乙個城市駐紮。

對於這種情況,我們需要記錄所有到了首都之後還有剩餘距離的軍隊,記錄編號和剩餘距離。

不能到達首都的軍隊,就封死自己最高能到的點就行了

然後再dfs一次,記錄還沒有被封死的,根節點的子樹,記錄距離。按距離給這些子樹從大到小排序。

對於這些子樹,如果有經過它到首都的軍隊,就取其中剩餘距離最短的;如果沒有,就取剩餘路程最長的。

重(keng)點:

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn = 50001;

int n, m, army[maxn], now_army[maxn];

int fir[maxn], nxt[maxn << 1], to[maxn << 1], len[maxn << 1], cnt;

int f[maxn][18], dep[maxn], du[maxn], flag[maxn], leaf[maxn];

ll dis[maxn], min[maxn];

int color[maxn], need[maxn], tag[maxn];

struct nodeq[maxn];

inline

int read()

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

return k*f;

}inline

void add_edge(int a, int b, int l)

inline

bool cmp1(node a, node b)

inline

bool cmp2(int a, int b)

void dfs(int u, int fa)

for(int i = fir[u]; i != -1; i = nxt[i])

if(du[u] == 0) leaf[u] = true;

}int jump(int cur, ll d)

}return cur;

}bool dfs2(int u, int fa)

return

false;

}bool check(ll tim)

else}}

if(!dfs2(1, 0)) return

true;

for(int i = fir[1]; i != -1; i = nxt[i])

}sort(q + 1, q + q[0].dis + 1, cmp1);

sort(need + 1, need + need[0] + 1, cmp2);

int cur = 1;

for(int i = 1; i <= need[0]; i++)

while(tag[q[cur].num] && cur <= q[0].dis) cur++; //已經使用

if(cur > q[0].dis) return

false; //沒軍隊了

//從首都調軍隊

if(q[cur].dis < dis[need[i]]) return

false;

tag[q[cur].num] = true;

}return

true;

}int main()

dep[1] = dis[1] = 0;

dfs(1, 0);

m = read();

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

int temp = 0;

for(int i = fir[1]; i != -1; i = nxt[i]) temp++;

if(m < temp)

long

long l = 0, r = 1e14, mid;

while(l < r)

printf("%lld", l);

return

0;}

NOIP2012 疫情控制

詳細的注釋已經寫到了 裡面。以後這種碼量多的最好都寫成函式再呼叫,確定好每個函式的作用。然後變數名最好也是有實際意義的qwq include include include include include define maxn 500010 using namespace std int n,m,...

NOIP 2012 疫情控制

題目鏈結 演算法 細心觀察發現 此題的答案具有單調性,也就是說,如果p小時能控制疫情,那麼q小時也能控制疫情 q p 因此我們可以二分答案,這是此題的突破口 問題就轉化為了檢驗 mid小時是否可以控制住疫情 我們發現,既然要求所有葉子節點得到管轄,那麼,軍隊所在的節點深度越淺,所能管轄的節點數就越多...

NOIP 2012 疫情控制

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