P1084 疫情控制

2022-05-13 10:12:50 字數 1522 閱讀 5976

p1084 傳送門

感覺noip t3也是有點東西的……

將該題轉化為最大值最小問題後想到二分答案

接下來考慮$check$時如何貪心:

由於除了在根節點所有軍隊都只往上跳明顯採取倍增的方式

記錄所有能到達根節點的軍隊和根節點下所有未被封死的子樹

將兩個序列從小到大排序後貪心匹配即可判斷

注意:在判斷封死子樹時不考慮能跳到根節點的軍隊

在匹配時用剩餘量最小的軍隊來封死原子樹即可

#include using

namespace

std;

#define x first

#define y second

#define pb push_backtypedef

double

db;typedef

long

long

ll;typedef pair

p;const ll inf=5e14;

const

int maxn=5e4+10

;struct edgee[maxn<<2

];int n,m,x,y,w,pos[maxn],head[maxn],f[maxn][30

],dep[maxn],tot;

int vis[maxn],cnt1,cnt2;ll d[maxn][30

];struct dataa[maxn],b[maxn];

bool cmp(data x,data y)

void add(int x,int y,int

w);head[x]=tot;}

void dfs(int x,int

anc)

}bool find(int x,int

anc)

;

else

return0;}}

return f2?(!f1):0;}

bool

check(ll x)

;

else vis[t]=1

; }

if(find(1,0)) return1;

int cur=1

; memset(vis,

0,sizeof

(vis));

sort(a+1,a+cnt1+1

,cmp);

sort(b+1,b+cnt2+1

,cmp);

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

vis[b[i].pos]=1

;

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

}while(cur<=cnt2&&!vis[b[cur].pos]) cur++;

return cur>cnt2;

}int

main()

printf(

"%lld

",l==inf?-1

:l);

return0;

}

P1084 疫情控制

p1084 疫情控制 好像二分 倍增 樹上差分是比較熱門的考尻點 會結合在一起考,難度比較大,需要多加練習。現在在解決noip最後的幾道大題,很鵝心。也沒有人做嚮導,很難受qwq 首先這是一棵樹,乙個軍隊肯定是越往上走越好。有大佬說過,對於這種提點的題,要是用倍增 要是時間最短,就是要是用時最長的軍...

P1084 疫情控制

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

洛谷P1084 (疫情控制)

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