Submission #1212452

#TimeUsernameProblemLanguageResultExecution timeMemory
1212452simona1230Split the Attractions (IOI19_split)C++20
0 / 100
548 ms1114112 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;

int s1,s2,s3,nn;
int s[200001];
vector<int> v[200001];
vector<int> ans;
int done[8];
int par[200001];
int ver=-1;
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]>=s2)
        ver=i;
}

int cnt;
void dfs2(int i,int p,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,i,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(a<=b&&b<=c)s2=b;
    else if(a<=c&&c<=b)s2=c;

    for(int i=0;i<p.size();i++)
        v[p[i]].push_back(q[i]),
        v[q[i]].push_back(p[i]);

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

    int col=1;
    if(c<a&&c<b)col=3;
    else if(b<a)col=2;
    done[col]=1;
    cnt=s1;
    dfs2(ver,-1,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(0,-1,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...