這題還是非常顯然的
題意大概是隨便選乙個點x,樹上每點有點權(v[x])和乙個代價(c[x]),你有乙個值m,設,我們用m可以最多大於y[x]個x的子樹中代價的和,求出所有點的y[x]*v[x]的值,其中最大值就是答案。
非常顯然用線段樹合併
還有可並堆的做法,不怎麼會會,下次學
#include#include#include#include#include#includeusing namespace std;
int lch[5000010],rch[5000010];
long long sum[5000010];
int cnt[5000010];
int idx;
int root[200010];
int merge(int u,int v)
void ins(int &rt,int l,int r,int x,int val)
sum[rt]+=val,cnt[rt]++;
if(l==r)
int mid=(l+r)/2;
if(x<=mid)else
}int bisearch(int rt,int l,int r,int limit)
if(l==r)else
} int mid=(l+r)/2;
if(limit>sum[lch[rt]])else
}struct node;
}stable_sort(t+1,t+n+1);
for(i=1;i<=n;++i)
for(i=n;i;--i)
}cout
}
APIO2012 派遣 解題報告
問題描述 在乙個忍者的幫派裡,一些忍者們被選中派遣給顧客,然後依據自己的工作獲取報償。在這個幫派裡,有一名忍者被稱之為master。除了master以外,每名忍者都有且僅有乙個上級。為保密,同時增強忍者們的領導力,所有與他們工作相關的指令總是由上級傳送給他的直接下屬,而不允許通過其他的方式傳送。現在...
APIO2012 派遣 左偏樹
題面 考慮列舉每個節點作為管理者,計算所獲得的滿意程度以更新答案。對於每個節點的計算,貪心,維護乙個大根堆,每次彈出薪水最大的人。這裡注意,一旦乙個人被彈出,那麼不再可能出現在其祖先們的最優解裡 廢話 所以使用可並堆左偏樹優化複雜度。include include define maxn 10001...
左偏樹 APIO2012 派遣
題意可真的是有毒 第一眼樹形揹包可做?反正我沒用樹形揹包打過,邊上巨佬打的揹包似乎沒拿分 後來發現可以貪心搞,我們先把乙個節點所有的兒子都取進去,之後不行的話再從大的開始拿走就好了 問題就變成了了如何快速維護各個節點子樹中的最大值,優先佇列就好了!關鍵是還要資瓷合併,pb ds庫就好了,手打左偏樹就...