Submission #317133

#TimeUsernameProblemLanguageResultExecution timeMemory
317133daniel920712Balanced Tree (info1cup18_balancedtree)C++14
23 / 100
4057 ms12792 KiB
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>

using namespace std;
vector < int > Next[100005];
int what[100005];
int Ans[1000005];
int con[1000005];
int sz[1000005];
int ans=0,now,N,nn;
bool have[1000005];
int root;
vector < pair < int , int > > xx,yy;
vector < int > vis;
int xxx[100005];
int yyy[100005];
void DFS(int st,int here,int fa,int deg)
{
    if(st!=here) if(what[here]==what[st]) now=min(now,deg);
    for(auto i:Next[here])
    {
        if(i!=fa)
        {
            DFS(st,i,here,deg+1);
        }
    }

}
void F(int here)
{
    int t,i;
    if(here==N+1)
    {
        t=0;
        for(i=1;i<=N;i++)
        {
            now=2e9;
            DFS(i,i,-1,0);
            t=max(t,now);
        }
        ans=min(ans,t);
        if(t==ans) for(i=1;i<=N;i++) Ans[i]=what[i];

    }
    else
    {
        if(what[here]==-1)
        {
            what[here]=1;
            F(here+1);
            what[here]=0;
            F(here+1);
            what[here]=-1;
        }
        else F(here+1);
    }
}
int DFS2(int here,int fa)
{
    vis.push_back(here);
    sz[here]=1;
    for(auto i:Next[here])
    {
        if(!have[i]&&i!=fa)
        {
            sz[here]+=DFS2(i,here);
        }
    }
    return sz[here];
}
void DFS3(int here,int fa)
{
    int t=nn-sz[here];
    xxx[here]=2e9;
    yyy[here]=2e9;
    for(auto i:Next[here])
    {
        if(!have[i]&&i!=fa)
        {
            DFS3(i,here);
            t=max(t,sz[i]);
        }
    }
    if(t<=nn/2) root=here;
}
void DFS4(int here,int fa,int deg,int fr)
{
    if(what[here]==0) xxx[fr]=min(xxx[fr],deg);
    if(what[here]==1) yyy[fr]=min(yyy[fr],deg);
    for(auto i:Next[here])
    {
        if(!have[i]&&i!=fa)
        {
            if(fa==-1) DFS4(i,here,deg+1,i);
            else DFS4(i,here,deg+1,fr);
        }
    }
}
void DFS5(int here,int fa,int deg,int fr)
{
    if(what[here]==0)
    {
        if(xx[0].second==fr) con[here]=min(con[here],deg+xx[1].first);
        else con[here]=min(con[here],deg+xx[0].first);
    }
    if(what[here]==1)
    {
        if(yy[0].second==fr) con[here]=min(con[here],deg+yy[1].first);
        else con[here]=min(con[here],deg+yy[0].first);
    }
    for(auto i:Next[here])
    {
        if(!have[i]&&i!=fa)
        {
            if(fa==-1) DFS5(i,here,deg+1,i);
            else DFS5(i,here,deg+1,fr);

        }
    }
}

void F2(int here)
{
    vis.clear();
    DFS2(here,-1);
    nn=sz[here];
    DFS3(here,-1);
    xxx[0]=2e9;
    yyy[0]=2e9;
    DFS4(root,-1,0,0);
    xx.clear();
    yy.clear();
    for(auto i:vis)
    {
        xx.push_back(make_pair(xxx[i],i));
        yy.push_back(make_pair(yyy[i],i));
    }
    xx.push_back(make_pair(xxx[0],0));
    yy.push_back(make_pair(yyy[0],0));
    sort(xx.begin(),xx.end());
    sort(yy.begin(),yy.end());
    if(vis.size()==1)
    {
        have[root]=1;
        return;
    }
    DFS5(root,-1,0,0);
    have[root]=1;
    for(auto i:Next[root]) if(!have[i]) F2(i);
}
int main()
{
    int T,M,i,x=0,y=0,ok;
    scanf("%d",&T);
    while(T--)
    {
        ok=0;
        ans=2e9;
        scanf("%d",&N);
        for(i=1;i<=N;i++) Next[i].clear();
        for(i=1;i<N;i++)
        {
            scanf("%d %d",&x,&y);
            Next[x].push_back(y);
            Next[y].push_back(x);
        }
        for(i=1;i<=N;i++)
        {
            scanf("%d",&what[i]);
            if(what[i]==-1) ok=1;
        }
        if(ok)
        {
            F(1);
            if(ans==2000000000) printf("-1\n");
            else
            {
                printf("%d\n",ans);
                for(i=1;i<=N;i++) printf("%d ",Ans[i]);
                printf("\n");
            }
        }
        else
        {
            x=0;
            y=0;
            for(i=1;i<=N;i++)
            {
                have[i]=0;
                con[i]=2e9;
                if(what[i]==1) x++;
                else y++;
            }
            if(x==1||y==1) printf("-1\n");
            else
            {
                ans=0;
                F2(1);
                for(i=1;i<=N;i++) ans=max(ans,con[i]);
                printf("%d\n",ans);
                for(i=1;i<=N;i++) printf("%d ",what[i]);
                printf("\n");


            }
        }

    }
    return 0;
}

Compilation message (stderr)

balancedtree.cpp: In function 'int main()':
balancedtree.cpp:156:11: warning: unused variable 'M' [-Wunused-variable]
  156 |     int T,M,i,x=0,y=0,ok;
      |           ^
balancedtree.cpp:157:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  157 |     scanf("%d",&T);
      |     ~~~~~^~~~~~~~~
balancedtree.cpp:162:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  162 |         scanf("%d",&N);
      |         ~~~~~^~~~~~~~~
balancedtree.cpp:166:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  166 |             scanf("%d %d",&x,&y);
      |             ~~~~~^~~~~~~~~~~~~~~
balancedtree.cpp:172:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  172 |             scanf("%d",&what[i]);
      |             ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...