FJOI2018 領導集團問題

2022-07-13 19:12:15 字數 882 閱讀 9826

題解我們可以先搞乙個\(dp\)出來,\(dp[u][i]\)表示以\(u\)號節點為根的子樹,選擇集合元素中最小的不小於\(i\)的最優方案。

然後我們可以發現這個\(dp\)是自帶乙個字尾\(max\)的,然後我們把它向後差分一下去維護。

那麼觀察到對於乙個節點,它的所有子樹之間是互不影響的,所以我們直接把他們對應位置加起來就好了。

然後考慮加入當前的根節點,發現這個\(dp\)值會有一段區間\(+1\),直接在差分陣列上維護就好了。

用\(set\)維護差分陣列的拐點超級好寫。。。

**

#include#define n 200009

using namespace std;

typedef long long ll;

int head[n],tot,n,w[n];

multisets[n];

multiset::iterator it;

inline ll rd()

while(isdigit(c))

return f?-x:x;

}struct edgee[n];

inline void add(int u,int v)

inline void merge(multiset&u,multiset&v)

void dfs(int u)

s[u].insert(w[u]);

it=s[u].lower_bound(w[u]);

if(it!=s[u].begin())--it,s[u].erase(it);

} int main()

dfs(1);

printf("%d",s[1].size());

return 0;

}

FJOI2018 領導集團問題

fjoi2018 領導集團問題 dp i j i為根子樹,最上面的值是j,選擇的最大值 觀察dp方程 1.整體dp已經可以做了。2.考慮優美一些的做法 dp i 如果對j取字尾最大值,顯然是不上公升的分段函式 而段數就是子樹sz 樹形dp的時候,子樹之間可以直接把分段函式按位相加。對於 w x 的,...

FJOI2018 領導集團問題

首先本題貪心不是很好做,可以考慮 dp 然後我們有了乙個很直接的想法,令 dp 表示以 i 號點為根當前選擇的節點中權值最小的權值為 j 的最大成員數,可以發現這樣做是 o n 3 的。可以發現這個 dp 有很多轉移是相同的,那麼我們這樣做是非常浪費的,為了能夠快速轉移,我們可以改變一下狀態,令 d...

FJOI2018 領導集團問題

給定帶點權樹,求最大的集合使得,集合內若兩點為祖孫關係,孫子權值 le 祖先權值 令 f 為 u 子樹內選擇 i 個點,最小值最大是多少,轉移顯然 考慮對每個點維護乙個可重集 s u 降序,第 i 個點為子樹內選擇 i 個點,最小值的最大可能值 合併兩個子樹 s s 直接合併集合即可 考慮將 u 加...