Codeforces Round #384 (Div. 2), problem: (D) Chloe and pleasant prizes Solution in C/C++

#include <stdio.h>
#include <string.h>
#define MAX(X,Y) ((X)>(Y) ? (X) : (Y))
#define INF 1000000000000000

typedef long long LL;
int n,sz,first[200010],next[400010],tail[400010],son[200010],bro[200010],vis[200010];
LL a[200010],s[200010],maxs[200010],maxs2[200010];
void addedge(int u,int v);
void dfs(int u);

int main(void)
{
    //freopen("prize.in","r",stdin);
    //freopen("prize.out","w",stdout);
    scanf("%d",&n);
    int i;
    for(i=1;i<=n;i++)
        scanf("%I64d",&a[i]);
    int u,v;
    memset(first,0,sizeof(first));
    for(sz=0,i=1;i<=n-1;i++)
    {
        scanf("%d%d",&u,&v);
        addedge(u,v);  addedge(v,u);
    }
    memset(vis,0,sizeof(vis));
    memset(son,0,sizeof(son));
    dfs(1);
    LL ans=-INF;
    for(i=1;i<=n;i++)
        ans=MAX(ans,maxs2[i]);
    if(ans==-INF) printf("Impossible\n");
    else printf("%I64d\n",ans);
    return 0;
}

void addedge(int u,int v)
{
    tail[++sz]=v;
    next[sz]=first[u];  first[u]=sz;
}

void dfs(int u)
{
    vis[u]=1;
    s[u]=a[u];  maxs[u]=-INF;
    int v,e;
    for(e=first[u];e;e=next[e])
    {
        v=tail[e];
        if(vis[v]) continue;
        bro[v]=son[u];  son[u]=v;
        dfs(v);
        s[u]+=s[v];  maxs[u]=MAX(maxs[u],maxs[v]);
    }
    maxs[u]=MAX(maxs[u],s[u]);
    maxs2[u]=-INF;
    LL t=maxs[son[u]];
    for(v=bro[son[u]];v;v=bro[v])
    {
        maxs2[u]=MAX(maxs2[u],t+maxs[v]);
        t=MAX(t,maxs[v]);
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *