Submission #1357485

#TimeUsernameProblemLanguageResultExecution timeMemory
1357485seirisiiiParking (CEOI22_parking)C++20
20 / 100
56 ms17680 KiB
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<vector<int>> space_cars;
vector<vector<int>> car_spaces;
vector<int> empty_spaces;
vector<pair<int,int>> moves;
queue<int> q_ready;
queue<int> q_top;
vector<bool> in_q;
bool is_matched(int c){
    return car_spaces[c][0]==car_spaces[c][1];
}
void do_move(int u,int v);
void check_color(int c){
    if(is_matched(c) or in_q[c])return;
    int u=car_spaces[c][0];
    int v=car_spaces[c][1];
    if(space_cars[u].back()==c and space_cars[v].back()==c){
        if(space_cars[u].size()==1 or space_cars[v].size()==1)q_ready.push(c);
        else q_top.push(c);
        in_q[c]=true;
    }
    return ;
}
void do_move(int u,int v){
    int c=space_cars[u].back();
    space_cars[u].pop_back();
    space_cars[v].emplace_back(c);
    moves.emplace_back(u,v);
    if(car_spaces[c][0]==u)car_spaces[c][0]=v;
    else car_spaces[c][1]=v;
    if(space_cars[u].empty())empty_spaces.emplace_back(u);
    else check_color(space_cars[u].back());
    return ;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>n>>m;
    space_cars.resize(m+1);
    car_spaces.resize(n+1);
    in_q.assign(n+1,false);
    for(int i=1;i<=m;++i){
        int b,t;
        cin>>b>>t;
        if(b!=0){
            space_cars[i].emplace_back(b);
            car_spaces[b].emplace_back(i);
        }
        if(t!=0){
            space_cars[i].emplace_back(t);
            car_spaces[t].emplace_back(i);
        }
        if(space_cars[i].empty())empty_spaces.emplace_back(i);
    }
    for(int i=1;i<=n;++i){
        check_color(i);
    }
    int search_ptr=1;
    while(true){
        if(!q_ready.empty()){
            int c=q_ready.front();
            q_ready.pop();
            if(is_matched(c))continue;
            int u=car_spaces[c][0];
            int v=car_spaces[c][1];
            if(space_cars[u].size()==1 and space_cars[v].size()>1)do_move(v,u);
            else do_move(u,v);
        }
        else if(!q_top.empty()){
            int c=q_top.front();
            q_top.pop();
            if(is_matched(c))continue;
            if(empty_spaces.empty()){
                cout<<"-1\n";
                return 0;
            }
            int e=empty_spaces.back();
            empty_spaces.pop_back();
            int u=car_spaces[c][0];
            int v=car_spaces[c][1];
            do_move(u,e);
            do_move(v,e);
        }
        else{
            int cycle_color=-1,top_space=-1;
            while(search_ptr<=n){
                int i=search_ptr;
                if(!is_matched(i)){
                    int u=car_spaces[i][0];
                    int v=car_spaces[i][1];
                    bool u_is_top=(space_cars[u].back()==i and space_cars[u].size()==2);
                    bool v_is_top=(space_cars[v].back()==i and space_cars[v].size()==2);
                    if(u_is_top){
                        cycle_color=i;
                        top_space=u;
                        break;
                    }else if(v_is_top){
                        cycle_color=i;
                        top_space=v;
                        break;
                    }
                }
                ++search_ptr;
            }
            if(cycle_color==-1)break;
            if(empty_spaces.empty()){
                cout<<"-1\n";
                return 0;
            }
            int e=empty_spaces.back();
            empty_spaces.pop_back();
            do_move(top_space,e);
        }
    }
    cout<<moves.size()<<"\n";
    for(auto i:moves){
        cout<<i.first<<" "<<i.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...