[題目鏈結]
[演算法]
細心觀察發現 : 此題的答案具有單調性,也就是說,如果p小時能控制疫情,那麼q小時也能控制疫情(q > p),因此我們可以二分答案,這是此題的突破口
問題就轉化為了檢驗」mid小時是否可以控制住疫情「
我們發現,既然要求所有葉子節點得到管轄,那麼,軍隊所在的節點深度越淺,所能管轄的節點數就越多,我們不妨讓每支軍隊都先移動到所能移動的最頂端(不能移動到根節點),具體實現時,我們可以通過倍增預處理每個節點向上2^j條邊的邊權總和。
此時,我們可以將軍隊分為兩類 :
第一類 : 位於根節點的兒子節點
第二類 : 位於非根節點的兒子節點
對於第二類軍隊,我們讓它保持不動即可,對於第一類軍隊,我們可以讓它管轄自己所在子樹的葉子節點,當然,我們也可以讓它跨過根節點,管轄其所能到達的(不超過時間限制的),其它子樹的葉子節點
這裡有一條結論 : 對於一支第一類軍隊,如果這支軍隊不能跨過根節點並回到該節點,那麼該節點必然由目前停留在這個節點上,且不能跨過根節點並回到該節點的,剩餘時間最少的軍隊所管轄
根據這條結論,我們對於每個尚未被管轄的,根節點的子節點,查詢是否有目前在該節點上並不能跨過根節點回到該節點的第一類軍隊,在這些軍隊中找剩餘時間最少的管轄該節點,並將這支軍隊刪除
對於剩餘的第一類軍隊,我們可以先求出尚未被管轄的,根節點的子節點,然後,將軍隊按剩餘時間 - 到達根節點的時間公升序排列,將節點按到根節點的距離公升序排列,貪心掃瞄一遍即可
[**]
#includeusingnamespace
std;
#define maxn 50010
#define maxlog 20
const
long
long inf =1e15;
struct
edge
e[maxn
<< 2
];struct
info
a[maxn],b[maxn];
inti,n,m,u,v,w,tot;
inthead[maxn],pos[maxn],depth[maxn];
long
long
min_rest[maxn];
intf[maxn][maxlog];
long
long
dist[maxn][maxlog];
long
long
sum,l,r,mid,ans;
bool
managed[maxn];
inline
bool
cmp(info a,info b)
inline
void addedge(int u,int v,intw);
head[u] =tot;
}inline
void dfs(int
u)
for (i = head[u]; i; i =e[i].nxt)
}inline
bool ok(int
u) res &=size;
if (depth[u] == 1 && !res) b[++tot] = (info);
return managed[u] =res;
}inline
bool check(long
long
mid)
for (i = 1; i <= m; i++) tmp[i] =pos[i];
for (i = 1; i <= m; i++)
if (depth[tmp[i]] == 1 && rest - dist[tmp[i]][0] > 0) a[++len] = (info);
else managed[tmp[i]] = true
; }
tot = 0
;
if (ok(1)) return
true
;
for (i = 1; i <= len; i++)}}
for (i = 1; i <= n; i++)
}tot = 0
;
if (ok(1)) return
true
; sort(a + 1,a + len + 1
,cmp);
sort(b + 1,b + tot + 1
,cmp);
now = 1
;
for (i = 1; i <= tot; i++)
return
true;}
intmain()
scanf("%d
",&m);
for (i = 1; i <= m; i++) scanf("
%d",&pos[i]);
dfs(1);
l = 0; r =sum;
ans = -1
;
while (l <=r)
else l = mid + 1
; }
printf(
"%lld\n
",ans);
return0;
}
NOIP2012 疫情控制
詳細的注釋已經寫到了 裡面。以後這種碼量多的最好都寫成函式再呼叫,確定好每個函式的作用。然後變數名最好也是有實際意義的qwq include include include include include define maxn 500010 using namespace std int n,m,...
NOIP 2012 疫情控制
h 國有 n 個城市,這 n 個城市用 n 1 條雙向道路相互連通構成一棵樹,1 號城市是首都,也是樹中的根節點。h 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境 城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境 城市的每一條路徑上都至少有...
noip2012 疫情控制
h國有n個城市,這n個城市用n 1條雙向道路相互連通構成一棵樹,1號城市是首都,也是樹中的根節點。h國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市的每一條路徑上都至少有乙個檢查點,邊境城市也...