題意可真的是有毒
第一眼樹形揹包可做?(反正我沒用樹形揹包打過,邊上巨佬打的揹包似乎沒拿分)
後來發現可以貪心搞,我們先把乙個節點所有的兒子都取進去,之後不行的話再從大的開始拿走就好了
問題就變成了了如何快速維護各個節點子樹中的最大值,優先佇列就好了!
關鍵是還要資瓷合併,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以外,每名忍者都有且僅有乙個上級。為保密,同時增強忍者們的領導力,所有與他們工作相關的指令總是由上級傳送給他的直接下屬,而不允許通過其他的方式傳送。現在...