bzoj5289
膜了一下pipiboss的題解
我覺得我自己描述的都沒有他好
所以就貼吧:
首先注意到實際上約束關係構成了一棵樹
考慮這個排列 pp,編號為 a[i]a[i] 的出現了,ii 才可以出現
那麼如果連邊 (a[i],i)(a[i],i),就會構成一棵以 00 為根的樹,每乙個點只有乙個父親
否則就不合法
因為要父親被選入,這個點才能被選入,所以排列 pp,相當於是這棵樹的一種合法的拓撲序
要求的就是代價最大的乙個拓撲序
那麼問題就和 poj2054poj2054 一樣的做法了,用乙個神奇的貪心
每次找出全域性的權值最小值,往父親合併,合併成新節點,權值為平均值,即 ∑wisize∑wisize
答案加上被合併的點的權值乘以父親的 sizesize
正確**性理解一下,具體證明和國王遊戲差不多,發現 swapswap 之後不會更優
果然set被卡了
code:
#pragma gcc opztime(2)
#include
#define ri register
#define ll long long
using
namespace std;
inline
intread()
while
(isdigit
(ch)
)return res*f;
}const
int n=
1e6+5;
struct nodep[n]
;int vis[n<<1]
,head[n<<1]
,nxt[n<<1]
,tot=0;
int n,a[n]
,ff[n]
,cnt=
0,w[n]
,in[n]
,fa[n]
;inline
void
add(
int x,
int y)
inline
bool
topsort()
for(ri int i=
1;i<=n;i++)if
(in[i]
>0)
return0;
return1;
}inline
bool
operator
<
(const node &a,
const node &b)
sets;
inline
intget
(int v)
intmain()
for(ri int i=
1;i<=n;i++
) cnt=n;p[0]
.s=1
; ll ans=
0;node t;
while
(!s.
empty()
)else ff[
get(t.x)]=
0,p[0]
.s+=t.s;
} cout
}
貪心 bzoj 3008 象棋
本題的難點是 移動過程中不能出現多顆棋子同時在某一格的情況 事實上,可以忽略此條件,因為棋子是相同的,我們可以用合法的等效方案替代一棋子越過另一棋子的情況 a b c三格,a能在一步走到b,b也能在一步走到c。在a的棋子需要走到存在棋子的b,接著走到c。此情形我們可以看成在b的棋子先走到c,接著在a...
bzoj4029 貪心 定價
description 在市場上有很多商品的定價類似於 999 元 4999 元 8999 元這樣。它們和 1000 元 5000 元和 9000 元並沒有什麼本質區別,但是在心理學上會讓人感覺便宜很多,因此也是商家常用的 策略。不過在你看來,這種 十分荒謬。於是你如此計算乙個 p p 為正整數 的...
bzoj4850 貪心 燈塔
description jsoi的國境線上有n一座連續的山峰,其中第ii座的高度是hi?為了簡單起見,我們認為這n座山峰排成了連續一條 直線.如果在第ii座山峰上建立一座高度為p p 0 的燈塔,jyy發現,這座燈塔能夠照亮第jj座山峰,當且僅當滿足如 下不等式 hj hi p sqrt i j j...