Submission #1310386

#TimeUsernameProblemLanguageResultExecution timeMemory
1310386mpawicka_77Parking (CEOI22_parking)C++20
20 / 100
175 ms140940 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+3;
vector<int>parking[N];
vector<int>gdzie[N];
set<int>puste;
vector<pair<int,int>>res;
bool zle=false;
void przeloz(int a,int b)
{
    res.push_back({a,b});
    if(parking[b].size()==0)puste.erase(b);
    int col=parking[a].back();
    parking[b].push_back(col);
    parking[a].pop_back();

    if(gdzie[col][0]==a)gdzie[col][0]=b;
    else gdzie[col][1]=b;

    if(parking[a].size()==0)puste.insert(a);
}
void jedynki(int nr_parkingu)
{
    if(parking[nr_parkingu].size()!=1)return;
    int col=parking[nr_parkingu][0];
    int nr2=gdzie[col][0];
    if(nr2==nr_parkingu)nr2=gdzie[col][1];
    if(parking[nr2].back()==col)
    {
        przeloz(nr2, nr_parkingu);
        if(parking[nr2].size()==1)
        {
            jedynki(nr2);
        }
    }
    else
    {
        int x=col, nr1=nr_parkingu;
        while(true)
        {
            int nr2=gdzie[x][0];
            if(nr2==nr1)nr2=gdzie[x][1];

            if(parking[nr2].back()==x)
            {
                if(puste.empty())
                {
                    zle=true;
                    break;
                }
                int miejsce=(*puste.begin());
                przeloz(nr1, miejsce);
                przeloz(nr2, miejsce);
                jedynki(nr1);
                jedynki(nr2);
                break;
            }
            else
            {
                x=parking[nr2].back();
                nr1=nr2;
            }
        }
    }
}
void park1(int nr_parkingu)
{
     if(parking[nr_parkingu].size()!=1)return;
    int col=parking[nr_parkingu][0];
    int nr2=gdzie[col][0];
    if(nr2==nr_parkingu)nr2=gdzie[col][1];

    if(parking[nr2].back()==col)
    {
        przeloz(nr2, nr_parkingu);
        if(parking[nr2].size()==1)
        {
            park1(nr2);
        }
    }

}
int32_t main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n, m;
    cin>>n >> m;
    for(int i=1; i<=m; i++)
    {
        int a,b;
        cin>>a>>b;
        if(a!=0)
        {
            parking[i].push_back(a);
            gdzie[a].push_back(i);
        }
        if(b!=0)
        {
            parking[i].push_back(b);
            gdzie[b].push_back(i);
        }
    }
    for(int i=1; i<=m; i++)
    {
        if(parking[i].size()==0)
        {
            puste.insert(i);
        }
    }
    for(int i=1; i<=m; i++)
    {
        if(parking[i].size()==1)park1(i);
    }
    for(int i=1; i<=m; i++)
    {
        if(parking[i].size()==1)
        {
            jedynki(i);
        }
    }
    if(zle)
    {
        cout<<"-1\n";
        return 0;
    }
    for(int i=1; i<=n; i++)
    {
        int nr1=gdzie[i][0], nr2=gdzie[i][1];
        if(nr1==nr2)continue;
        if(parking[nr1].back()==i&&parking[nr2].back()==i)
        {
            if(puste.size()==0)
            {
                cout<<"-1\n";
                return 0;
            }
            int miejsce=*puste.begin();
            przeloz(nr1, miejsce);
            przeloz(nr2, miejsce);
            park1(nr1);
            park1(nr2);
            jedynki(nr1);
            jedynki(nr2);
        }
        if(zle)
        {
            cout<<"-1\n";
            return 0;
        }
    }
    for(int i=1; i<=n; i++)
    {
        int nr1=gdzie[i][0], nr2=gdzie[i][1];
        if(nr1==nr2)continue;
        if(puste.size()==0)
        {
            cout<<"-1\n";
            return 0;
        }
        int miejsce=*puste.begin();
        przeloz(nr1, miejsce);
        jedynki(nr1);
        jedynki(miejsce);
    }
    cout<<res.size()<<"\n";
    for(auto x:res)cout<<x.first<<" "<<x.second<<"\n";

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