一道很全(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 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境 城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境 城市的每一條路徑上都至少有...