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;
}