P4577 FJOI2018 領導集團問題

2022-04-30 08:54:15 字數 840 閱讀 4952

p4577 [fjoi2018]領導集團問題

我們對整棵樹進行dfs遍歷,並用乙個multiset維護對於每個點,它的子樹可取的最大點集。

我們遍歷到點$u$時:

不選點$u$,顯然答案就為它的所有子樹的子集大小之和(所以答案是單調不減的)

選點$u$時,我們lower_bound乙個比$val[u]$小且最接近$val[u]$的權值,用$val[u]$替換它。

為什麼可以醬紫做呢

試想一下,當multiset中的元素都被替換到比點$k$的權值$val[k]$大時

這時把$val[k]$扔進去,就相當於找到了一種更優的子集取法。

雖然替換後multiset表示的子集不一定合法

但是答案單調不減(為multiset的大小)啊

所以沒什麼關係辣

#include#include

#include

#include

#define rint register int

using

namespace

std;

void read(int &x)

#define n 200005

intn,v[n];

intcnt,hd[n],nxt[n],ed[n],poi[n];

multiset

h[n];

multiset

::iterator it;

inline

void adde(int x,int

y)void merge(int x,int

y)void dfs(int

x)int

main()

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