APIO2012 派遣 左偏樹

2022-05-20 23:09:47 字數 642 閱讀 6054

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

#include #include #define maxn 100010

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

#define ll long long

using namespace std;

int n,m,rot;

ll ans;

int head[maxn],nxt[maxn*2],vv[maxn*2],tot;

inline void add_edge(int u, int v)

int val[maxn],lead[maxn],sl[maxn],sr[maxn],dis[maxn];

int merge(int a, int b)

}ans=max(ans, (ll)sz[u]*lead[u]);

}int main()

dfs(rot);

printf("%lld", ans);

return 0;

}

左偏樹 APIO2012 派遣

題意可真的是有毒 第一眼樹形揹包可做?反正我沒用樹形揹包打過,邊上巨佬打的揹包似乎沒拿分 後來發現可以貪心搞,我們先把乙個節點所有的兒子都取進去,之後不行的話再從大的開始拿走就好了 問題就變成了了如何快速維護各個節點子樹中的最大值,優先佇列就好了!關鍵是還要資瓷合併,pb ds庫就好了,手打左偏樹就...

APIO2012 派遣 題解

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

APIO2012 派遣 解題報告

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