洛谷P1084 NOIP2012 二分 set

2021-09-26 07:45:44 字數 2644 閱讀 1654

題面

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