p1084 疫情控制
好像二分、倍增、樹上差分是比較熱門的考尻點
會結合在一起考,難度比較大,需要多加練習。
現在在解決noip最後的幾道大題,很鵝心。也沒有人做嚮導,很難受qwq
首先這是一棵樹,乙個軍隊肯定是越往上走越好。(有大佬說過,對於這種提點的題,要是用倍增)
要是時間最短,就是要是用時最長的軍隊用時最短,使用二分
然後對於乙個走不到首都的軍隊來說,也肯定是所處深度越小越好
對於可以到達首都的軍隊來說(不在其子樹停留,不過要儲存其在那顆子樹),我們先通過dfs遍歷一遍,找出還有那些子樹沒有被封鎖,再考慮派軍隊過去,到根節點的兒子,講這一顆子樹封鎖
然後我們貪心的派軍隊。用時小的路徑,拍剩餘時間少的軍隊。如果剩餘時間最少的軍隊不能過去,則讓其返回其子樹的根節點。
如果如此操作之後,仍有子樹沒有被封鎖,則需要加大時間
#include#include#include#includeusing std::sort;
const int maxn=50100;
int n,m;
struct node
;struct data
;data need[maxn],army[maxn];
node line[maxn<<1];
int head[maxn],tail;
int f[maxn][22];
int dis[maxn][22];
int nt,at;
int stop[maxn];
int pos[maxn];
int son[maxn];
void add(int a,int b,int c)
int read()
return res;
}void dfs(int now,int fa,int d)
if(f[now][0]==1&&t-used-son[now]>=0)//可以到達首都
else
stop[now]=true;
}for(int i=head[1];i;i=line[i].nxt)
if(!dfs(line[i].p,1))//判斷乙個子樹是否被完全封鎖
else
stop[line[i].p]=true;
sort(army+1,army+1+at,compare);//排個序
sort(need+1,need+1+nt,compare);
int i=1,j=0;
for(;i<=nt;i++)
}if(j==at+1) return false;//軍隊用完了,而還有子樹沒有被封鎖
}return true;
}int main()
if(l!=200000) printf("%d",l);
else printf("-1");
return 0;
}
P1084 疫情控制
p1084 傳送門 感覺noip t3也是有點東西的 將該題轉化為最大值最小問題後想到二分答案 接下來考慮 check 時如何貪心 由於除了在根節點所有軍隊都只往上跳明顯採取倍增的方式 記錄所有能到達根節點的軍隊和根節點下所有未被封死的子樹 將兩個序列從小到大排序後貪心匹配即可判斷 注意 在判斷封死...
P1084 疫情控制
p1084 疫情控制 hh 國有 nn個城市,這 n 個城市用n 1條雙向道路相互連通構成一棵樹,1號城市是首都,也是樹中的根節點。hh國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市的每一條...
洛谷P1084 (疫情控制)
h 國有 n 個城市,這 n 個城市用 n 1 條雙向道路相互連通構成一棵樹,1 號城市是首都,也是樹中的根節點。h 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市 的每一條路徑上都至少有乙...