Submission #1212545

#TimeUsernameProblemLanguageResultExecution timeMemory
1212545simona1230Split the Attractions (IOI19_split)C++20
40 / 100
74 ms28744 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;

int s1,s2,s3,nn;
int s[200001];
vector<int> v[200001],v1[200001];
vector<int> ans;
int done[8];
int par[200001];
int ver=-1;

int used[200001];
void dfs0(int i)
{
    used[i]=1;
    for(int j=0;j<v1[i].size();j++)
    {
        int nb=v1[i][j];
        if(used[nb])continue;
        dfs0(nb);
        v[i].push_back(nb);
        v[nb].push_back(i);
    }
}

void dfs(int i,int p)
{
    for(int j=0; j<v[i].size(); j++)
    {
        int nb=v[i][j];
        if(nb==p)continue;
        dfs(nb,i);
        par[nb]=i;
        s[i]+=s[nb];
    }
    s[i]++;
    if(s[i]>=s1&&nn-s[i]>=s1)
        ver=i;
}

int cnt;
void dfs2(int i,int c)
{
    if(cnt==0)return;
    ans[i]=c;
    cnt--;

    for(int j=0; j<v[i].size(); j++)
    {
        int nb=v[i][j];
        if(ans[nb]==0&&nb!=par[i])
            dfs2(nb,c);
    }
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q)
{
    nn=n;
    s1=min(a,min(b,c));
    s3=max(a,max(b,c));
    s2=a;
    if(b==c)s2=b;
    else if(a<b&&b<c)s2=b;
    else if(a<c&&c<b)s2=c;
    //cout<<s1<<" "<<s2<<" "<<s3<<endl;

    for(int i=0; i<p.size(); i++)
        v1[p[i]].push_back(q[i]),
        v1[q[i]].push_back(p[i]);
        dfs0(0);
    int st=0;
    for(int i=0; i<n; i++)
        if(v[i].size()==0)st=i;

        st=0;
    dfs(st,-1);
    ans.resize(n);
    if(ver==-1)return ans;

    if(s[ver]>=s2)
    {
        int col;
        if(s2==a)col=1;
        else if(s2==b)col=2;
        else col=3;

        cnt=s2;
        //cout<<s2<<endl;
        dfs2(ver,col);
        done[col]=1;


        if(done[1]&&b<c)col=2;
        else if(done[1]&&c<=b)col=3;
        else if(done[2]&&a<c)col=1;
        else if(done[2]&&a>=c)col=3;
        else if(a<b)col=1;
        else col=2;

        //cout<<s1<<endl;
        cnt=s1;
        dfs2(st,col);
        done[col]=1;
    }
    else
    {
        int col=1;
        if(c<a&&c<b)col=3;
        else if(b<a)col=2;
        done[col]=1;
        cnt=s1;
        dfs2(ver,col);

        if(col==1&&b<c)col=2;
        else if(col==2&&a<c)col=1;
        else if(col==3&&a<=b)col=1;
        else if(col==1&&b>c)col=3;
        else if(col==2&&a>=c)col=3;
        else col=2;
        done[col]=1;
        cnt=s2;
        dfs2(st,col);
    }

    int col;
    if(!done[1])col=1;
    else if(!done[2])col=2;
    else col=3;
    for(int i=0; i<n; i++)
        if(ans[i]==0)ans[i]=col;

    return ans;
}
#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...