社区讨论

我是女生刚学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 条回复,欢迎继续交流。

正在加载回复...