如果我们选择编号为 1的忍者作为管理者并且派遣第三个和第四个忍者,薪水总和为 4,没有超过总预算 4。因为派遣了 2 个忍者并且管理者的领导力为 3,
用户的满意度为 2 ,是可以得到的用户满意度的最大值。
#include <stdio.h>
#define MAXN 100010
#define dmax(a,b) ((a)>(b)?(a):(b))
#define MAXBUF 1<<22
#define gec() ((S==T&&(T=(S=B)+fread(B,1,MAXBUF,stdin),S==T))?0:*S++)
char B[MAXBUF],*S=B,*T=B;
template<typename Type> inline void Rin(Type &x) {
int c=gec();
for(;c<48||c>57;c=gec());
for(x=0;c>47&&c<58;x=(x<<1)+(x<<3)+c-48,c=gec()); }
inline void swap(int &x,int &y) {x^=y,y^=x,x^=y;}
int n,M,C[MAXN],L[MAXN],tot,root[MAXN],ls[MAXN],rs[MAXN],va[MAXN];long long sum[MAXN],size[MAXN],ans;
struct Pointer {
int v;
Pointer *next; }*fir[MAXN],mem[MAXN],*nil=mem;
inline void link(int x,int y) {
*++nil=(Pointer){y,fir[x]},fir[x]=nil; }
int merge(int x,int y) {
if(!(x&&y))return x|y;
if(va[x]<va[y])swap(x,y);
rs[x]=merge(rs[x],y);
swap(ls[x],rs[x]);
return x;
}
inline void pop(int &x) {x=merge(ls[x],rs[x]);}
void _dfs(int at) {
root[at]=++tot,va[tot]=C[at],size[at]=1,sum[at]=C[at];
for(Pointer *iter=fir[at];iter;iter=iter->next)
_dfs(iter->v),
sum[at]+=sum[iter->v],
size[at]+=size[iter->v],
root[at]=merge(root[at],root[iter->v]);
while(sum[at]>M)
size[at]--,sum[at]-=va[root[at]],pop(root[at]);
ans=dmax(ans,L[at]*size[at]);
}
int main() {
Rin(n),Rin(M);
for(int i=1,x;i<=n;i++)
Rin(x),Rin(C[i]),Rin(L[i]),link(x,i);
_dfs(1),printf("%lld\n",ans);
return 0; }