제출 #1082007

#제출 시각아이디문제언어결과실행 시간메모리
1082007TlenekWodoruThousands Islands (IOI22_islands)C++17
100 / 100
103 ms40280 KiB
#include<bits/stdc++.h>
#include "islands.h"
#include <variant>
using namespace std;
vector<int>D[200009];
vector<int>Num[200009];
vector<int>T[200009];
vector<int>Num2[200009];
int n,m;
bool usu[200009];
int stopien[200009];
bool zaj[200009];
int Next[200009],NextNum[200009];
bool CzyCykl[200009];
vector<int>A,U;
void UsuVert(int v)
{
    usu[v]=1;
    for(int som : T[v])
    {
        stopien[som]--;
        if(usu[som]==0&&stopien[som]==0){U.push_back(som);}
    }
}
void VectorAdd(vector<int>&Odp,const vector<int>&Dod, bool CzyRevers=0)
{
    if(CzyRevers==0)
    {
        for(int u : Dod)
        {
            Odp.push_back(u);
        }
    }
    else
    {
        for(int i=(int)Dod.size()-1;i>=0;i--)
        {
            Odp.push_back(Dod[i]);
        }
    }
}
void coutt(string A, vector<int>AA)
{
    cout<<A<<"=";
    for(int u : AA)
    {
        cout<<u<<',';
    }
    cout<<endl;
}
variant<bool, vector<int>> find_journey(
    int N, int M, vector<int> E1, vector<int> E2)
{
    n=N;
    m=M;
    for(int i=0;i<m;i++)
    {
        stopien[E1[i]]++;
        D[E1[i]].push_back(E2[i]);
        Num[E1[i]].push_back(i);
        T[E2[i]].push_back(E1[i]);
        Num2[E2[i]].push_back(i);
    }
    for(int i=0;i<n;i++)
    {
        if(stopien[i]==0)
        {
            U.push_back(i);
        }
    }
    int start=0;
    while(true)
    {
        if((int)U.size()>0)
        {
            const int u=U.back();
            U.pop_back();
            UsuVert(u);
        }
        else if(stopien[start]==1)
        {
            int som=-1,ind=-1;
            for(int i=0;i<(int)D[start].size();i++)
            {
                som=D[start][i];
                ind=Num[start][i];
                if(usu[som]==0){break;}
            }
            UsuVert(start);
            A.push_back(ind);
            start=som;
        }
        else{break;}
    }
    if(usu[start]){return false;}
    memset(Next,-1,sizeof(Next));
    memset(NextNum,-1,sizeof(NextNum));
    vector<int>V1,K1,Droga1,Cykl1;
    vector<int>V2,K2,Droga2,Cykl2;
    int v;
    v=start;
    int casee=-1,spotkanie=-1;
    while(true)
    {
        int som=-1,ind=-1;
        for(int i=0;i<(int)D[v].size();i++)
        {
            som=D[v][i];
            ind=Num[v][i];
            if(usu[som]==0){break;}
        }
        zaj[v]=1;
        Next[v]=som;
        NextNum[v]=ind;
        V1.push_back(v);
        K1.push_back(ind);
        if(zaj[som])
        {
            spotkanie=som;
            while(true)
            {
                bool czyBreak=0;
                if(V1.back()==som){czyBreak=1;}
                CzyCykl[V1.back()]=1;
                Cykl1.push_back(K1.back());
                V1.pop_back();
                K1.pop_back();
                if(czyBreak){break;}
            }
            reverse(Cykl1.begin(),Cykl1.end());
            Droga1=K1;
            break;
        }
        v=som;
    }
    v=start;
    while(true)
    {
        int som=-1,ind=-1;
        for(int i=D[v].size()-1;i>=0;i--)
        {
            som=D[v][i];
            ind=Num[v][i];
            if(usu[som]==0){break;}
        }
        zaj[v]=1;
        V2.push_back(v);
        K2.push_back(ind);
        if(zaj[som])
        {
            if(Next[som]==-1)
            {
                while(true)
                {
                    bool czyBreak=0;
                    if(V2.back()==som){czyBreak=1;}
                    Cykl2.push_back(K2.back());
                    V2.pop_back();
                    K2.pop_back();
                    if(czyBreak){break;}
                }
                reverse(Cykl2.begin(),Cykl2.end());
                Droga2=K2;
                casee=1;
            }
            else
            {
                v=som;
                if(CzyCykl[v])
                {
                    Droga2=K2;
                    int v2=v;
                    while(true)
                    {
                        Cykl2.push_back(NextNum[v2]);
                        v2=Next[v2];
                        if(v2==v){break;}
                    }
                }
                else
                {
                    while(v!=spotkanie)
                    {
                        V2.push_back(Next[v]);
                        K2.push_back(NextNum[v]);
                        v=Next[v];
                    }
                    Droga2=K2;
                    Cykl2=Cykl1;
                }
                casee=2;
            }
            break;
        }
        v=som;
    }
    vector<int>Odp;
    VectorAdd(Odp,A);
    if(casee==1)
    {
        VectorAdd(Odp,K1);
        VectorAdd(Odp,Cykl1);
        VectorAdd(Odp,K1,1);
        VectorAdd(Odp,K2);
        VectorAdd(Odp,Cykl2);
        VectorAdd(Odp,K2,1);
        VectorAdd(Odp,K1);
        VectorAdd(Odp,Cykl1,1);
        VectorAdd(Odp,K1,1);
        VectorAdd(Odp,K2);
        VectorAdd(Odp,Cykl2,1);
        VectorAdd(Odp,K2,1);
    }
    else if(casee==2)
    {
        VectorAdd(Odp,K1);
        VectorAdd(Odp,Cykl1);
        VectorAdd(Odp,K1,1);
        VectorAdd(Odp,K2);
        VectorAdd(Odp,Cykl2,1);
        VectorAdd(Odp,K2,1);
    }
    VectorAdd(Odp,A,1);
    return Odp;
}
#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...