Noip2012 疫情控制

2022-06-18 16:18:14 字數 1462 閱讀 7834

由於最後一支軍隊駐紮的時間就是答案,顯然我們需要讓所有軍隊駐紮的時間的最大值最小化。這裡我們可以用到二分答案。首先二分出乙個mid作為判定合法的limitation。然後我們根據上面的貪心策略,讓所有軍隊在lim的時間內盡量地往上走。然後我們會發現會有軍隊走到了首都的兒子節點處,但是時間還沒到lim,此時讓它越過首都到達首都的其它未被駐紮的兒子節點可能會更優。

所以我們的下一步就是——處理出第一步所有軍隊盡量往上走之後還未被控制的首都的子節點。注意根據題意,這裡的'控制'一詞含義為——這個點有軍隊駐紮或者它的所有兒子都被控制。根據這個定義,我們只需要dfs就可以求出來首都的哪些子節點未被控制。

這時我們明確思路,我們設rest[x]表示第x支軍隊到達首都之後(注意是首都)與lim相差多少時間,也就是剩下的時間。然後我們顯然讓剩餘時間最多的軍隊去駐紮離首都最遠的子節點是最優的。所以我們把首都的未被控制的子節點按照與首都的距離從大到小排序,再把所有時間沒到lim的軍隊按照rest從大到小排序,然後判斷能否在lim內把所有地方控制完即可。

然而我們會發現乙個問題,我們讓有剩餘時間的軍隊越過首都去駐紮其它城市可能不是最優的。如果這個城市本來就走上來了乙個時間沒到lim的軍隊,我們顯然讓這支軍隊駐紮在這座城市是最優的。但如果這個城市有多支時間沒到lim的軍隊呢?我們顯然是讓rest最小的一支留下來。所以我們還需要記下首都的子節點的rest最小的軍隊。

\[o((mn+n+mlogm+degree(1)*log_degree(1)+degree(1))*log_ans)

\]degree表示這個點的度數。解釋一下複雜度是怎麼來的:mn是每支軍隊往上走的複雜度,n是dfs尋找沒被占領的城市的複雜度,mlogm是對軍隊排序的複雜度,degree(1) * logdegree(1)是對首都的子節點排序的複雜度,最後的degree(1)表示判合法的複雜度

#include#include#include#include#include#define maxn 50001

using namespace std;

struct edge

edge(const int &_to,const int &_dis,const int &_next)

}e[maxn<<1];

int head[maxn],k;

struct node

}a[maxn],b[maxn];

int da,db,army[maxn];

int minrest[maxn],min_id[maxn];

bool vis[maxn],use[maxn];

int fa[maxn][20],dep[maxn],maxdep;

long long dis[maxn][20];

int n,m;

inline int read()

return true;

}int main()

printf("%lld\n",ans);

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