JSOI2016 最佳團隊

2021-08-04 23:33:49 字數 880 閱讀 7858

看到這個什麼比值最大,立馬想到了二分答案。

然後就變成了乙個樹上揹包問題,直接暴力合併揹包即可。

暴力合併不是o(

n3) 的嗎?

記錄一下子樹的大小,揹包時的上界設為這個,就降成o(

n2) 。

感性證明:

你可以想象兩個點只會在它們的lca處合併。

code:

#include 

#include

#define fd(i, x, y) for(int i = x; i >= y; i --)

#define fo(i, x, y) for(int i = x; i <= y; i ++)

#define max(a, b) ((a) > (b) ? (a) : (b))

using namespace std;

const int n = 2505;

double d[n], f[n][n], q[n];

intm, n, s[n], p[n], r[n], siz[n];

int tot, final[n];

struct node e[n * 2];

void link(int

x, int

y) void dg(int

x) siz[x] += siz[y];

}}bool pd(double mid)

int main()

printf("%.3lf", ans);

}

JSOI2016 最佳團隊

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

JSOI2016 最佳團隊

這題,二分 樹上揹包即可。由於答案要最大 最值 所以我們可以二分。然後我們可以簡化一下答案。那麼每個點的貢獻即為 p i mid s i 做樹上揹包,看一下f 0 k 是否大於0即可。上標 include include include define db double using namespac...

JSOI 2016 最佳團體

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