BZOJ5289 貪心 HNOI2018 排列

2021-09-11 17:06:56 字數 1604 閱讀 4972

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...