P4322 JSOI2016 最佳團體

2021-09-28 02:00:15 字數 1454 閱讀 4547

01

0101

分數規劃與樹形dpdp

dp結合題意:

求∑ pi

∑s

i\frac}}

∑si​∑p

i​​的最大值,我們可以二分乙個v

vv,則我們只需要求∑pi

>∑s

i∗v=

=>∑p

i−∑s

i∗

v>

0\sum>\sum*v~==>~\sum-\sum*v>0~

∑pi​

>∑s

i​∗v

==>∑p

i​−∑

si​∗

v>0就okok

ok讓每乙個點的權值等於pi−

si∗v

-*vpi

​−si

​∗v,然後做乙個樹形dp。

樹形d pdp

dp就直接用有依賴的揹包問題則可以解決

最後乙個注意點就是這題有乙個虛根,也就是0號節點

#include

#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)

#define ll long long

#define eps 1e-4

using

namespace std;

const

int maxn=

1e5+10;

const

int maxm=

2500+10

;int n,cnt,m;

double f[maxm]

[maxm]

,head[maxn]

,w[maxn]

;int fa[maxn]

,size[maxn]

;double l=

0.0,r=

10000.0

,ans=0;

template

<

class

t>

inline

void

read

(t &x)

while

(isdigit

(ch)

) x*

=f;}

struct nodea[maxn]

;struct

e[maxn]

;void

add(

int u,

int v)

void

readdata()

}void

dfs(

int u,

double mid)}}

}void

work()

printf

("%.3lf"

,l);

}int

main()

JSOI2016 最佳團隊

這種最大化形如 x y 的式子的題,很容易想到分數規劃。二分答案,對於當前的mid,設d i p i mid s i 考慮到當乙個節點i被選,那麼fa i 也要被選,那麼乙個想法是選取當前最大的d,然後把它的兒子的d放入堆裡。但是這個方法是錯誤的 然而我一開始就這麼打了,只有10分 題目給出的是一棵...

JSOI2016 最佳團隊

看到這個什麼比值最大,立馬想到了二分答案。然後就變成了乙個樹上揹包問題,直接暴力合併揹包即可。暴力合併不是o n3 的嗎?記錄一下子樹的大小,揹包時的上界設為這個,就降成o n2 感性證明 你可以想象兩個點只會在它們的lca處合併。code include include define fd i,x...

JSOI 2016 最佳團體

有 n n 名候選人,從 1 role presentation 11到 n n 編號,有乙個隊長的編號為 0 role presentation 0 0,每個候選人都由一位編號比他小的候選人推薦 如果為 0 0 則表示是隊長推薦的 隊長希望招募 k role presentation k k個人,...