#$description$
[題面](
給你一顆$n$個節點帶權的樹,告訴你有$m$個軍隊以及他們駐紮的節點,軍隊經過一條邊的時間是這條邊的權值,要求移動軍隊(所有軍隊可以同時移動,可以重合),使得每一條從根到葉子結點上都有軍隊駐紮,根節點不能駐紮軍隊,葉子結點可以駐紮軍隊。求完成部署的最短時間是多少。
#$solution$
因為所有軍隊可以同時移動,所以部署完成的時間就是到達指定位置最慢的那個軍隊花費的時間,也就是讓最長時間最短,這樣一歸納顯然這道題是個二分答案。
那麼如何$check$呢,考慮到乙個點上有軍隊,他子樹的所有路徑都已經合法了,所以讓他盡量往上移動,一定能讓合法的路徑數更多,所以在二分出的時間內,讓每個軍隊盡可能往上走,並且記錄他的最終位置。
假如乙個軍隊能到達根節點,那麼他可以走到根節點的其他子樹了。所以我們用結構體記錄下他來,然後$dfs$整棵樹,假如根節點的某棵子樹沒有被完全覆蓋,那我們記錄一下這顆子樹的編號,他們是需要別的軍隊從別的子樹經過根節點過來幫忙,根據貪心,顯然這些軍隊只需要從根節點走到這個子樹的根節點距離最短而且覆蓋所有子樹內的點(也就是經過子樹-根節點這條邊)。
總結一下,開兩個結構體,乙個記錄到達根節點可以去支援的軍隊的編號以及他還能走的時間,乙個記錄沒有被覆蓋的根節點的子樹以及他到根節點的距離,將兩個結構體從大到小,剩餘時間長的去覆蓋距離長的子樹(假如答案是有解的這樣貪心一定是對的,一定能找出一組合法解),如果覆蓋不了就是無解。不過需要注意一點,有可能一顆子樹有自己軍隊可以覆蓋,但是他走到了根節點上,在\(dfs\)過程中這顆子樹會被視為沒有覆蓋,這種情況我們從所有從該子樹走出去的軍隊選出剩餘時間最短的拿來覆蓋,這樣也是個對的貪心,剩餘時間長的去覆蓋別的子樹。所以我們記錄所有根節點的子樹的走出去軍隊的最小剩餘時間和編號,匹配的時候先看能不能被自己軍隊覆蓋,然後標記用過,如果不行就找最大的來覆蓋。
另外向上走的過程可以使用倍增優化,還有注意開\(long\ long\)。
更多細節見**
#include#include#include#include#define re register
#define maxn 50010
#define ll long long
using namespace std;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}struct edgee[maxn<<2];
bool flag,flag2,okk[maxn];
ll tmp1;
ll rest[maxn],dis[maxn][23];
int used[maxn];
int x,y,z,head[maxn],cnt,n,m,loc[maxn];
int restmin[maxn],restid[maxn],vis[maxn];
int cnt2,na,nb,f[maxn][23];
struct nodea[maxn],b[maxn];
inline void add(int u,int v,int w)
void dfs1(int now,int fa,ll w)//預處理
for(int i=head[now];i;i=e[i].nxt) }
bool cmp(node a,node b)
void dfs2(int now,int fa)
if(!h) flag=false;//如果是葉子節點還沒有回溯就代表這條路徑沒被占領
}bool check(ll co)
return true; }
ll erfen()
return l;
}int main()
{ n=read();
for(re int i=1;i
洛谷P1084 NOIP2012 二分 set
題面 quad 大體思路 因為用更多的時間肯定也可以完成要求,所以滿足單調性,所以考慮二分答案。對於每次的答案mid midmi d,把所有 軍隊在mid midmi d的時間內盡量往上提,可以用倍增在單次o l ogn o logn o logn 的時間裡做到。如果能到達根節點,往set sets...
NOIP2012 洛谷P1084 疫情控制
description h 國有 n 個城市,這 n 個城市用 n 1 條雙向道路相互連通構成一棵樹,1 號城市是首都,也是樹中的根節點。h 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市的...
P1084 疫情控制
p1084 疫情控制 好像二分 倍增 樹上差分是比較熱門的考尻點 會結合在一起考,難度比較大,需要多加練習。現在在解決noip最後的幾道大題,很鵝心。也沒有人做嚮導,很難受qwq 首先這是一棵樹,乙個軍隊肯定是越往上走越好。有大佬說過,對於這種提點的題,要是用倍增 要是時間最短,就是要是用時最長的軍...