社区讨论
我是女生刚学OI,蒟蒻求教QAQ
P1552[APIO2012] 派遣参与者 41已保存回复 48
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 48 条
- 当前快照
- 1 份
- 快照标识符
- @mi6vfn9z
- 此快照首次捕获于
- 2025/11/20 11:28 4 个月前
- 此快照最后确认于
- 2025/11/20 17:22 4 个月前
CPP
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int const N=1e5+1;
int n,t,m,c[N],p[N],prev[4*N],last[4*N],to[4*N],d[N],r[N],ans,sum[N],size[N],root[N],s,l[N];
void add(int a,int b){
to[++t]=b;
prev[t]=last[a];
last[a]=t;
return;
}
int merge(int x,int y){
if(!x||!y) return x+y;
if(c[x]<c[y]) swap(x,y);
r[x]=merge(r[x],y);
if(d[r[x]]>d[l[x]]) swap(l[x],r[x]);
d[x]=d[r[x]]+1;
return x;
}
void dfs(int x){
root[x]=x,sum[x]=c[x],size[x]=1;
for(int j=last[x];j;j=prev[j]){
int y=to[j];
dfs(y);
sum[x]+=sum[y];
size[x]+=size[y];
root[x]=merge(root[x],root[y]);
}
while(sum[x]>m){
int y=root[x];
sum[x]-=c[y];
size[x]--;
root[x]=merge(l[y],r[y]);
}
ans=max(ans,p[x]*size[x]);
}
int main(int argc, char** argv) {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int a;
scanf("%d%lld%lld",&a,&c[i],&p[i]);
if(a) add(a,i);else s=i;
}
dfs(s);
printf("%d",ans);
return 0;
}
只有可怜的14分只对了5个点...?QAQ
回复
共 48 条回复,欢迎继续交流。
正在加载回复...