看到這個什麼比值最大,立馬想到了二分答案。
然後就變成了乙個樹上揹包問題,直接暴力合併揹包即可。
暴力合併不是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個人,...