답안 #649442

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
649442 2022-10-10T08:29:16 Z berr Easter Eggs (info1cup17_eastereggs) C++17
81 / 100
378 ms 720 KB
#include <bits/stdc++.h>
#include "grader.h"

using namespace std;
vector<int> adj[513], de(513), val(513), zort[513];
int n, all, ans=-1;

void dfs(int v, int p)
{
    val[v]=0;

    if(de[v]==0) 
    {
        for(auto i: adj[v])
        {
            if(i==p||de[i]==1) continue;
            dfs(i, v);
            val[v]+=val[i];
        }

        val[v]++;
    }
}

void dfs2(int v, int p)
{

    zort[v].clear();

    zort[v].push_back(v);


    if(de[v]==0)
    {
        for(auto i: adj[v])
        {
            if(i==p||de[i]) continue;
            dfs2(i, v);
            if(p!=v)
            {
                for(auto l: zort[i]) zort[v].push_back(l);
            }
        }

    }
}


array<int, 2> decide(int v)
{
    val[v]=0;

    dfs(v, v);
    vector<int> q;

    for(int i=0; i<=n; i++) zort[i].clear();
    for(auto i: adj[v])
    {
        if(de[i]) continue;

        q.push_back(val[i]);
    }
    sort(q.begin(), q.end());
    reverse(q.begin(), q.end());

    array<int, 2> h={1, 1};

    for(auto i: q)
    {

        if(abs((h[0]+i)-h[1])<=abs((h[0])-(h[1]+i)))
        {
            h[0]+=i;
        }
        else
        {
            h[1]+=i;
        }
    }


    array<int, 2> p={0, 1};

    p[0]=q[0];


    for(int i=1; i<q.size(); i++)
    {
        p[1]+=q[i];
    }


    if(abs(p[0]-p[1])<=abs(h[0]-h[1])) h=p;

    return h;

}
void findroot()
{

    array<int, 2> q{(int)1e9, 0};
    int ind =0;
    for(int i=1; i<=n; i++)
    {

        if(de[i]==0)
        {
            auto p=decide(i);

            if((abs(p[1]-p[0])<=abs(q[1]-q[0]))||((abs(p[1]-p[0])==abs(q[1]-q[0]))&&q[1]+q[0]>p[1]+p[0]))
            {
                ind = i;
                q=p;
            }
        }
    }

    dfs2(ind, ind);

    vector<array<int, 2>> qq;

    for(auto i: adj[ind])
    {
        if(de[i]) continue;
        qq.push_back({(int)zort[i].size(), i});
    }



    sort(qq.begin(), qq.end());
    reverse(qq.begin(), qq.end());

    vector<int> h0, h1;

    array<int,2> a={1, 1};

    h1.push_back(ind);
    h0.push_back(ind);




    for(auto i: qq)
    {
        if(abs((a[0]+i[0])-a[1])<abs(a[0]-(a[1]+i[0])))
        {
            for(auto l: zort[i[1]])
            {
                h0.push_back(l);
            }   
            a[0]+=i[0];

        }
        else
        {
            for(auto l: zort[i[1]])
            {
                h1.push_back(l);
            }   
            a[1]+=i[0];
        }
    }

  if(abs((a[1]+a[0]-1)-qq[0][0])<=abs(a[0]-a[1]))
    {
        h0.clear();
        h1.clear();

        for(auto i: zort[qq[0][1]])
        {
            h0.push_back(i);
        }

        h1.push_back(ind);

        for(int i=1; i<qq.size(); i++)
        {
            for(auto l: zort[qq[i][1]])
            {
                h0.push_back(l);
            }
        }
    }


  if(all==2)
    {
        vector<int> f;
        for(int i=1; i<=n; i++)
        {
            if(de[i]==0) f.push_back(i);
        }
        h1.clear();
        h0.clear();
        h1.push_back(f[0]);
        h0.push_back(f[1]);
    }



    for(int i=0; i<=n; i++) de[i]=1;
        all=0;

        int p=query(h0); 

    if(p)
    {
        for(auto i: h0)
        {
            all++;
            de[i]=0;
        }
    }
    else
    {
        for(auto i: h1)
        {
            all++;
            de[i]=0;
        }
    }

    


}


int findEgg(int N, vector < pair < int, int > > bridges)
{


    for(int i=0; i<=N; i++) de[i]=val[i]=0;
        all=N;
    for(int i=1; i<=N; i++) adj[i].clear();
  ans=-1;
    all=n=N;

    for(auto i: bridges)
    {
        adj[i.first].push_back(i.second);

        adj[i.second].push_back(i.first);
    }

    while(all>1)
    {
        findroot();


 

    }

    for(int i=1; i<=N; i++)
    {
        if(de[i]==0) ans=i;
    }

    return ans;
}


Compilation message

eastereggs.cpp: In function 'std::array<int, 2> decide(int)':
eastereggs.cpp:87:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |     for(int i=1; i<q.size(); i++)
      |                  ~^~~~~~~~~
eastereggs.cpp: In function 'void findroot()':
eastereggs.cpp:176:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  176 |         for(int i=1; i<qq.size(); i++)
      |                      ~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Partially correct 2 ms 208 KB Number of queries: 5
2 Partially correct 2 ms 208 KB Number of queries: 5
3 Partially correct 2 ms 208 KB Number of queries: 5
4 Partially correct 2 ms 208 KB Number of queries: 5
# 결과 실행 시간 메모리 Grader output
1 Correct 45 ms 336 KB Number of queries: 9
2 Partially correct 131 ms 372 KB Number of queries: 10
3 Partially correct 302 ms 336 KB Number of queries: 11
4 Partially correct 214 ms 348 KB Number of queries: 10
# 결과 실행 시간 메모리 Grader output
1 Partially correct 378 ms 720 KB Number of queries: 10
2 Partially correct 274 ms 336 KB Number of queries: 10
3 Partially correct 320 ms 336 KB Number of queries: 11
4 Partially correct 225 ms 336 KB Number of queries: 10