记录编号 397650 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [APIO 2012] 派遣 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 3.415 s
提交时间 2017-04-20 20:00:26 内存使用 97.95 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10,M=5e6+10;
typedef long long ll;
struct Node{int l,r,s;ll v;}node[M];int id;
int n,m,fa[N],c[N],l[N],sa[N],r[N],root[N];
bool cmp(int x,int y){return c[x]<c[y];}
#define lc node[x].l
#define rc node[x].r
int add(int x,int l,int r,int p){
	int now=++id;
	node[now]=node[x];
	node[now].s++;
	node[now].v+=c[sa[p]];
	if (l==r) return now;
	int mid=(l+r)>>1;
	if (p>mid) node[now].r=add(rc,mid+1,r,p);
		else node[now].l=add(lc,l,mid,p);
	return now;
}
int merge(int x,int y,int l,int r){
	if (!x||!y) return x|y;
	int now=++id,mid=(l+r)>>1;
	node[now].s=node[x].s+node[y].s;
	node[now].v=node[x].v+node[y].v;
	node[now].l=merge(lc,node[y].l,l,mid);
	node[now].r=merge(rc,node[y].r,mid+1,r);
	return now;
}
int query(int x){
	int S=m,l=1,r=n,ans=0;
	while (l<r){
		int mid=(l+r)>>1;
		if (S<=node[lc].v) x=lc,r=mid;
		else{
			S-=node[lc].v;
			ans+=node[lc].s;
			x=rc;l=mid+1;
		}
	}
	if (S>=node[x].v) ans+=node[x].s;
	return ans;
}
int main()
{
	freopen("dispatching.in","r",stdin);
	freopen("dispatching.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
		scanf("%d%d%d",&fa[i],&c[i],&l[i]),sa[i]=i;
	sort(sa+1,sa+n+1,cmp);
	for (int i=1;i<=n;i++) r[sa[i]]=i;
	ll ans=0;
	for (int i=n;i;i--){
		root[i]=add(root[i],1,n,r[i]);
		ans=max(ans,(ll)l[i]*query(root[i]));
		if (!fa[i]) break;
		root[fa[i]]=merge(root[fa[i]],root[i],1,n);
	}
	printf("%lld\n",ans);
	return 0;
}