제출 #1190118

#제출 시각아이디문제언어결과실행 시간메모리
1190118alexddSplit the Attractions (IOI19_split)C++20
40 / 100
553 ms1114112 KiB
#include "split.h"
#include<bits/stdc++.h>
using namespace std;
vector<int> con[200005];

int n,a,b,c;
int id[3];
int cntv;
vector<int> visited;
void usor(int nod, int b, int val)
{
    if(cntv==b)
        return;
    visited[nod] = val;
    cntv++;
    for(int adj:con[nod])
        if(!visited[adj])
            usor(adj,b,val);
}
vector<int> solve_toate_mici()
{
    int cntcap=0;
    for(int cap=0;cap<n;cap++)
    {
        if(con[cap].size() == 1)
        {
            cntcap++;
            if(cntcap==1)
            {
                cntv=0;
                usor(cap,a,1);
            }
            else
            {
                cntv=0;
                usor(cap,b,2);
            }
        }
    }
    if(cntcap==0)
    {
        for(int cap=0;cap<n;cap++)
        {
            if(visited[cap]==0 && cntcap<2)
            {
                cntcap++;
                if(cntcap==1)
                {
                    cntv=0;
                    usor(cap,a,1);
                }
                else
                {
                    cntv=0;
                    usor(cap,b,2);
                }
            }
        }
    }
    assert(cntcap==2);
    for(int i=0;i<n;i++)
        if(visited[i]==0)
            visited[i]=3;
    return visited;
}
vector<int> solve_a1()
{
    usor(0,b,2);
    for(int i=0;i<n;i++)
    {
        if(visited[i]==0)
        {
            visited[i]=1;
            break;
        }
    }
    for(int i=0;i<n;i++)
        if(visited[i]==0)
            visited[i]=3;
    return visited;
}

int siz[200005];
void dfs(int nod, int par)
{
    siz[nod]=1;
    for(int adj:con[nod])
    {
        if(adj==par)
            continue;
        dfs(adj,nod);
        siz[nod]+=siz[adj];
    }
}
int root1,root2;
void dfs2(int nod, int par)
{
    if(root1!=-1)
        return;
    if(par!=-1 && siz[nod]>=a && n-siz[nod]>=b)
    {
        root1=nod;
        root2=par;
        return;
    }
    if(par!=-1 && siz[nod]>=b && n-siz[nod]>=a)
    {
        root1=par;
        root2=nod;
        return;
    }
    for(int adj:con[nod])
    {
        if(adj==par)
            continue;
        dfs2(adj,nod);
    }
}
vector<int> solve_arbore()
{
    id[0] = 1;
    id[1] = 2;
    id[2] = 3;
    for(int pas=0;pas<5;pas++)
    {
        if(a > b)
        {
            swap(a,b);
            swap(id[0],id[1]);
        }
        if(b > c)
        {
            swap(b,c);
            swap(id[1],id[2]);
        }
    }

    dfs(0,-1);
    root1=root2=-1;
    dfs2(0,-1);
    if(root1==-1)
        return vector<int>(n,0);
    visited[root1] = id[0];
    visited[root2] = id[1];
    
    cntv=0;usor(root1,a,id[0]);
    cntv=0;usor(root2,b,id[1]);
    for(int i=0;i<n;i++)
        if(visited[i]==0)
            visited[i]=id[2];
    return visited;
}

std::vector<int> find_split(int copn, int copa, int copb, int copc, std::vector<int> p, std::vector<int> q)
{
    a = copa;
    b = copb;
    c = copc;
    n = copn;

    visited.resize(n,0);
    for(int i=0;i<p.size();i++)
    {
        con[p[i]].push_back(q[i]);
        con[q[i]].push_back(p[i]);
    }
    bool all_mici=1;
    for(int i=0;i<n;i++)
        if(con[i].size() > 2)
            all_mici=0;
    if(all_mici)
        return solve_toate_mici();
    else if(a==1)
        return solve_a1();
    return solve_arbore();
}
#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...