96pts求调
查看原帖
96pts求调
1010363
lkjlkjlkj2012楼主2024/6/7 19:00
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int n,t,a[200005],sz[200005],d[200005],maxd[200005];
long long sum[200005],f[200005],g[200005],S[200005],F[200005];
vector<int> e[200005];
struct node
{
    long long sum,sz,id;
}tmp[200005];
int tot;
bool cmp(node a,node b)
{
    return 2*a.sz*b.sum<=2*b.sz*a.sum;
}
void dfs(int u,int fa)
{
    sz[u]=1;
    d[u]=d[fa]+1;
    maxd[u]=d[u];
    sum[u]=a[u];
    if(e[u].size()==1)
    {
        f[u]=g[u]=0;
        return;
    }
    for(int v:e[u])
    {
        if(v==fa)
            continue;
        dfs(v,u);
        sum[u]+=sum[v];
        sz[u]+=sz[v];
        maxd[u]=max(maxd[u],maxd[v]);
    }
    tot=0;
    for(int v:e[u])
    {
        if(v==fa)
            continue;
        tmp[++tot]=(node){sum[v],sz[v],v};
    }
    sort(tmp+1,tmp+tot+1,cmp);
    long long ti=0;
    S[tot+1]=F[tot+1]=0;
    for(int i=tot;i>=1;i--)
    {
        int v=tmp[i].id;
        S[i]=S[i+1]+sum[v];
        F[i]=F[i+1]+sum[v]+f[v]+2*sz[v]*S[i+1];
    }
    for(int i=1;i<=tot;i++)
    {
        int v=tmp[i].id;
        if(maxd[u]==maxd[v])
        {
            g[u]=min(g[u],f[u]+ti*S[i+1]+F[i+1]+((sz[u]-sz[v]-1)*2+1)*sum[v]+g[v]);
        }
        f[u]+=(ti+1)*sum[v]+f[v];
        ti+=sz[v]*2;
    }
}
int main()
{
    cin>>n>>t;
    for(int i=2;i<=n;i++)
    {
        int p;
        cin>>p>>a[i];
        e[i].push_back(p);
        e[p].push_back(i);
    }
    d[0]=-1;
    memset(g,0x3f,sizeof(g));
    dfs(1,0);
    if(t==0)
        cout<<2*n-2<<" "<<f[1];
    else
        cout<<2*n-2-maxd[1]<<" "<<g[1];
    return 0;
}

记录

2024/6/7 19:00
加载中...