P1084 疫情控制

2022-04-30 00:51:18 字數 1477 閱讀 5108

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