Submission #441572

#TimeUsernameProblemLanguageResultExecution timeMemory
441572azberjibiouFountain Parks (IOI21_parks)C++17
30 / 100
154 ms19732 KiB
#include "parks.h"
#include <bits/stdc++.h>
using namespace std;
#define fir first
#define sec second
const int mxN=200020;
int N;
int A[3][mxN];
bool Chk[3][mxN];
int par[mxN];
vector <int> u, v, a, b;
int findpar(int a)
{
    return (par[a]==a ? a : par[a]=findpar(par[a]));
}
void onion(int a, int b)
{
    int p=findpar(a), q=findpar(b);
    if(p!=q)    par[p]=q;
}
int construct_roads(std::vector<int> x, std::vector<int> y) {
    N=x.size();
    for(int i=1;i<=100000;i++)  for(int j=0;j<3;j++)    A[j][i]=-1;
    for(int i=0;i<N;i++)
    {
        if(x[i]==2)         A[0][y[i]/2]=i;
        else if(x[i]==4)    A[1][y[i]/2]=i;
        else    A[2][y[i]/2]=i;
    }
    for(int i=0;i<N;i++)    par[i]=i;
    for(int i=1;i<100000;i++)
    {
        for(int j=0;j<=2;j++)
        {
            if(A[j][i]!=-1 && A[j][i+1]!=-1)  onion(A[j][i], A[j][i+1]);
        }
    }
    for(int i=1;i<=100000;i++)
    {
        for(int j=0;j<2;j++)
        {
            if(A[0][i]!=-1 && A[1][i]!=-1)    onion(A[0][i], A[1][i]);
            if(A[1][i]!=-1 && A[2][i]!=-1)    onion(A[1][i], A[2][i]);
        }
    }
    for(int i=0;i<N-1;i++)
    {
        if(findpar(i)!=findpar(i+1))
        {
            return 0;
        }
    }
    for(int i=1;i<100000;i++)
    {
        for(int j=0;j<3;j++)
        {
            if(A[j][i]!=-1 && A[j][i+1]!=-1)
            {
                u.push_back(A[j][i]);   v.push_back(A[j][i+1]);
                b.push_back(2*i+1);
                if(j==0)    a.push_back(1);
                else if(j==2)   a.push_back(7);
                else if(i%2==0) a.push_back(5);
                else    a.push_back(3);
            }
        }
    }
    for(int i=1;i<=100000;i++)
    {
        if(A[0][i]!=-1 && A[1][i]!=-1 && !Chk[0][i-1])
        {
            Chk[0][i]=true;
            u.push_back(A[0][i]);   v.push_back(A[1][i]);
            a.push_back(3);
            if(i%2==0)  b.push_back(2*i+1);
            else    b.push_back(2*i-1);
        }
        if(A[1][i]!=-1 && A[2][i]!=-1 && !Chk[2][i-1])
        {
            Chk[2][i]=true;
            u.push_back(A[1][i]);   v.push_back(A[2][i]);
            a.push_back(5);
            if(i%2==0)  b.push_back(2*i-1);
            else    b.push_back(2*i+1);
        }
    }
    build(u, v, a, b);
    return 1;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...