題面
\quad
大體思路:因為用更多的時間肯定也可以完成要求,
所以滿足單調性,所以考慮二分答案。對於每次的答案mid
midmi
d,把所有
軍隊在mid
midmi
d的時間內盡量往上提,可以用倍增在單次o(l
ogn)
o(logn)
o(logn
)的時間裡做到。如果能到達根節點,往set
setse
t中插入該軍隊到根節點後還能移動的距離(下文稱之為可移動距離),這些軍隊可以進駐在自身的可移動距離內的任意節點。
\quad
所有節點都盡量向上移動後,統計根節點各個子節點是否需要軍隊駐紮。如果某個子節點a
aa沒有軍隊上到根節點且需要軍隊,那麼直接在set中找到可移動距離盡量小但能到達a
aa的軍隊駐紮並在set
setse
t中刪除該軍隊。
\quad
如果某個節點b
bb有軍隊到了根節點但是需要駐紮,我們設根到該節點距離為w
ww,該點往set
setse
t中插入的的軍隊的可移動距離為v
vv(有多個取較小值),我們討論一下:
\quad
如果所有根節點子節點都有駐紮,那麼這個mid
midmi
d是合法的。總的時間複雜度是o(n
log2
n)
o(nlog^2n)
o(nlog
2n)。常數略大,僅供娛樂。
另外如果軍隊數小於根節點的子節點數,那麼無解,輸出-1。
// luogu-judger-enable-o2
#include
using
namespace std;
#define mn 50005
#define inf 1e16
#define lg 17
#define ll long long
#define itset multiset::iterator
inline
intmax
(int a,
int b)
//提醒一下,三目運算子速度比if……else快,但是沒有1個if快
inline
intread()
return a;
}struct edge};
//vector建邊的結構體
vectoredge[mn]
;multisetcnt;
//記錄根節點儲存的節點
int fa[lg]
[mn]
,tag[mn]
,n,m,u,v,w,loc[mn]
;ll up[mn]
,cost[lg]
[mn]
,lon[mn]
;//fa、cost:倍增的父親陣列和花費的時間
//loc:軍隊初始位置
//tag:這個節點是否有軍隊
//up:從這個節點上到根節點的軍隊的可移動距離
//lon:一棵樹的最長鏈
void
dfs(
int x)
//倍增預處理
for(
int i=
0;i.size()
;++i)
if(edge[x]
[i].to!=fa[0]
[x])
}voidup(
int x,ll t)
if(t[x])
//跳不了了,打個標記
up[x]
=min
(up[x]
,t-cost[0]
[x])
;//記錄由這個節點跳上去的軍隊的最小的可移動距離
cnt.
insert
(t-cost[0]
[x])
;//插入該軍隊的可移動距離
}void
dfs(
int x)}}
bool
chk(ll t)
dfs(1)
;//統計
for(
int i=
0;i.size()
;++i)
}//直接把這個軍隊撤回來
}for
(int i=
0;i.size()
;++i)
//上下2個操作不能同時進行,不然可能把需要撤回的軍隊拿去駐紮了,比較麻煩
}return1;
}signed
main()
dfs(1)
; m=
read()
;for
(int i=
1;i<=m;
++i)
loc[i]
=read()
; ll l=-1
; ll r=lon[1]
<<1;
//最大需要的時間是最長鏈的2倍
while
(l+1
//左開右閉的奇葩二分小心品嚐。。。
printf
("%lld"
,r);
return0;
}
P1084 NOIP 2012 疫情控制
description 題面 給你一顆 n 個節點帶權的樹,告訴你有 m 個軍隊以及他們駐紮的節點,軍隊經過一條邊的時間是這條邊的權值,要求移動軍隊 所有軍隊可以同時移動,可以重合 使得每一條從根到葉子結點上都有軍隊駐紮,根節點不能駐紮軍隊,葉子結點可以駐紮軍隊。求完成部署的最短時間是多少。solu...
NOIP2012 洛谷P1084 疫情控制
description h 國有 n 個城市,這 n 個城市用 n 1 條雙向道路相互連通構成一棵樹,1 號城市是首都,也是樹中的根節點。h 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市的...
洛谷P1084 (疫情控制)
h 國有 n 個城市,這 n 個城市用 n 1 條雙向道路相互連通構成一棵樹,1 號城市是首都,也是樹中的根節點。h 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市 的每一條路徑上都至少有乙...