답안 #317124

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
317124 2020-10-29T03:49:26 Z daniel920712 Balanced Tree (info1cup18_balancedtree) C++14
0 / 100
4000 ms 12792 KB
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>

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 xx,yy,root;
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)
{
    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];
    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)
{
    if(what[here]==0) xx=min(xx,deg);
    if(what[here]==1) yy=min(yy,deg);
    for(auto i:Next[here])
    {
        if(!have[i]&&i!=fa)
        {
            DFS4(i,here,deg+1);
        }
    }
}
void DFS5(int here,int fa,int deg)
{
    if(what[here]==0) con[here]=min(con[here],deg+xx);
    if(what[here]==1) con[here]=min(con[here],deg+yy);
    for(auto i:Next[here])
    {
        if(!have[i]&&i!=fa)
        {
            DFS5(i,here,deg+1);

        }
    }
}

void F2(int here)
{
    DFS2(here,-1);
    nn=sz[here];
    DFS3(here,-1);
    xx=2e9;
    yy=2e9;
    DFS4(root,-1,0);
    DFS5(root,-1,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

balancedtree.cpp: In function 'int main()':
balancedtree.cpp:121:11: warning: unused variable 'M' [-Wunused-variable]
  121 |     int T,M,i,x=0,y=0,ok;
      |           ^
balancedtree.cpp:122:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  122 |     scanf("%d",&T);
      |     ~~~~~^~~~~~~~~
balancedtree.cpp:127:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  127 |         scanf("%d",&N);
      |         ~~~~~^~~~~~~~~
balancedtree.cpp:131:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  131 |             scanf("%d %d",&x,&y);
      |             ~~~~~^~~~~~~~~~~~~~~
balancedtree.cpp:137:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  137 |             scanf("%d",&what[i]);
      |             ~~~~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 2688 KB Output isn't correct
2 Incorrect 28 ms 2688 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 79 ms 2936 KB Output isn't correct
2 Incorrect 237 ms 5240 KB Output isn't correct
3 Incorrect 141 ms 3448 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4024 ms 2688 KB Time limit exceeded
2 Execution timed out 4034 ms 12792 KB Time limit exceeded
3 Execution timed out 4053 ms 6528 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4043 ms 3456 KB Time limit exceeded
2 Execution timed out 4025 ms 2688 KB Time limit exceeded
3 Execution timed out 4043 ms 2816 KB Time limit exceeded
4 Execution timed out 4040 ms 2688 KB Time limit exceeded
5 Execution timed out 4022 ms 2688 KB Time limit exceeded
6 Execution timed out 4029 ms 3192 KB Time limit exceeded
7 Execution timed out 4029 ms 2688 KB Time limit exceeded
8 Execution timed out 4035 ms 2688 KB Time limit exceeded
9 Execution timed out 4025 ms 2688 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 2688 KB Output isn't correct
2 Incorrect 28 ms 2688 KB Output isn't correct
3 Incorrect 79 ms 2936 KB Output isn't correct
4 Incorrect 237 ms 5240 KB Output isn't correct
5 Incorrect 141 ms 3448 KB Output isn't correct
6 Execution timed out 4024 ms 2688 KB Time limit exceeded
7 Execution timed out 4034 ms 12792 KB Time limit exceeded
8 Execution timed out 4053 ms 6528 KB Time limit exceeded
9 Execution timed out 4043 ms 3456 KB Time limit exceeded
10 Execution timed out 4025 ms 2688 KB Time limit exceeded
11 Execution timed out 4043 ms 2816 KB Time limit exceeded
12 Execution timed out 4040 ms 2688 KB Time limit exceeded
13 Execution timed out 4022 ms 2688 KB Time limit exceeded
14 Execution timed out 4029 ms 3192 KB Time limit exceeded
15 Execution timed out 4029 ms 2688 KB Time limit exceeded
16 Execution timed out 4035 ms 2688 KB Time limit exceeded
17 Execution timed out 4025 ms 2688 KB Time limit exceeded
18 Execution timed out 4021 ms 3192 KB Time limit exceeded
19 Execution timed out 4024 ms 6648 KB Time limit exceeded
20 Execution timed out 4043 ms 2688 KB Time limit exceeded
21 Runtime error 6 ms 5248 KB Execution killed with signal 11 (could be triggered by violating memory limits)
22 Execution timed out 4029 ms 2688 KB Time limit exceeded