左偏樹 APIO2012 派遣

2022-05-25 02:33:09 字數 1041 閱讀 2971

題意可真的是有毒

第一眼樹形揹包可做?(反正我沒用樹形揹包打過,邊上巨佬打的揹包似乎沒拿分)

後來發現可以貪心搞,我們先把乙個節點所有的兒子都取進去,之後不行的話再從大的開始拿走就好了

問題就變成了了如何快速維護各個節點子樹中的最大值,優先佇列就好了!

關鍵是還要資瓷合併,pb_ds庫就好了,手打左偏樹就好了

有人說這是裸題...但我真的看了好久...肯定是我tcl

1 #include2

#define int long long

3#define writeln(x) write(x),puts("")

4#define writep(x) write(x),putchar(' ')

5using

namespace

std;

6 inline int

read()

9while(isdigit(chr))

10return ans*f;

11 }void write(int

x)const

int m = 2e5+5;16

intn,m;

17int son[m][2

],fa[m],dis[m],val[m],a[m],b[m],ans;

18int head[m],ver[m<<1],nxt[m<<1

],tot,sum[m],sz[m];

19#define ls son[x][0]

20#define rs son[x][1]

21 inline void cmax(int &x,int y)

22 inline void add(int x,int y)

23int merge(int x,int

y)32

signed main()while(sum[x]>m)cmax(ans,b[x]*sz[x]);

48 }printf("

%lld

",ans);

49return0;

50 }

APIO2012 派遣 左偏樹

題面 考慮列舉每個節點作為管理者,計算所獲得的滿意程度以更新答案。對於每個節點的計算,貪心,維護乙個大根堆,每次彈出薪水最大的人。這裡注意,一旦乙個人被彈出,那麼不再可能出現在其祖先們的最優解裡 廢話 所以使用可並堆左偏樹優化複雜度。include include define maxn 10001...

APIO2012 派遣 題解

這題還是非常顯然的 題意大概是隨便選乙個點x,樹上每點有點權 v x 和乙個代價 c x 你有乙個值m,設,我們用m可以最多大於y x 個x的子樹中代價的和,求出所有點的y x v x 的值,其中最大值就是答案。非常顯然用線段樹合併 還有可並堆的做法,不怎麼會會,下次學 include includ...

APIO2012 派遣 解題報告

問題描述 在乙個忍者的幫派裡,一些忍者們被選中派遣給顧客,然後依據自己的工作獲取報償。在這個幫派裡,有一名忍者被稱之為master。除了master以外,每名忍者都有且僅有乙個上級。為保密,同時增強忍者們的領導力,所有與他們工作相關的指令總是由上級傳送給他的直接下屬,而不允許通過其他的方式傳送。現在...