Description
Input
Output
Sample Input
5 4
0 3 3
1 3 5
2 2 2
1 2 4
2 3 1
Sample Output
HINT
如果我們選擇編號爲1的忍者作爲管理者並且派遣第三個和第四個忍者,薪水總和爲4,沒有超過總預算4。因爲派遣了2個忍者並且管理者的領導力爲3,用戶的滿意度爲2,是可以得到的用戶滿意度的最大值。
正解:左偏樹
dfs遍歷每個結點,在回溯時合併這個點及它的所有兒子。對於每個集合維護一個大根堆的左偏樹,當一棵樹內薪水之和大於m時就刪除根節點,對於每顆樹取一個最大的size*lead。
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf 1<<30
#define il inline
#define RG register
#define ull unsigned long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
struct left_tree{
int ls,rs,dis,size;
ull key,tot;
}ltree[100010];
struct edge{ int nt,to; }g[200010];
int head[100010],lead[100010],n,m,num;
ull ans;
il int gi(){
RG int x=0,q=0; RG char ch=getchar();
while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); if (ch=='-') q=1,ch=getchar();
while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q ? -x : x;
}
il void insert(RG int from,RG int to){ g[++num]=(edge){head[from],to},head[from]=num; return; }
il void build(RG int x,RG int k){ ltree[x]=(left_tree){0,0,0,1,(ull)k,(ull)k}; return; }
il int merge(RG int x,RG int y){
if (!x) return y; if (!y) return x; if (ltree[x].key<ltree[y].key) swap(x,y);
ltree[x].rs=merge(ltree[x].rs,y); RG int &l=ltree[x].ls,&r=ltree[x].rs;
ltree[x].tot=ltree[l].tot+ltree[r].tot+ltree[x].key,ltree[x].size=ltree[l].size+ltree[r].size+1;
if (ltree[l].dis<ltree[r].dis) swap(l,r); if (!r) ltree[x].dis=0; else ltree[x].dis=ltree[r].dis+1;
return x;
}
il int dfs(RG int x){
RG int rt=x; for (RG int i=head[x];i;i=g[i].nt) rt=merge(rt,dfs(g[i].to));
while (ltree[rt].tot>(ull)m) rt=merge(ltree[rt].ls,ltree[rt].rs);
ans=max(ans,(ull)ltree[rt].size*(ull)lead[x]); return rt;
}
il void work(){
n=gi(),m=gi(); RG int f,c;
for (RG int i=1;i<=n;++i) f=gi(),c=gi(),lead[i]=gi(),build(i,c),insert(f,i);
dfs(1); printf("%llu",ans); return;
}
int main(){
File("dispatching");
work();
return 0;
}