记录编号 |
397650 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
[APIO 2012] 派遣 |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
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;
}