題面 考慮列舉每個節點作為管理者,計算所獲得的滿意程度以更新答案。對於每個節點的計算,貪心,維護乙個大根堆,每次彈出薪水最大的人。這裡注意,一旦乙個人被彈出,那麼不再可能出現在其祖先們的最優解裡(廢話),所以使用可並堆左偏樹優化複雜度。
#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以外,每名忍者都有且僅有乙個上級。為保密,同時增強忍者們的領導力,所有與他們工作相關的指令總是由上級傳送給他的直接下屬,而不允許通過其他的方式傳送。現在...