Submission #1310000

#TimeUsernameProblemLanguageResultExecution timeMemory
1310000olizarowskibParking (CEOI22_parking)C++20
20 / 100
53 ms141032 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
#define ft first
#define sc second
#define pb push_back
#define all(x) x.begin(), x.end()
#define pi pair<int, int>
#define vi vector<int>
#define tii tuple<int, int, int>
#define tiii tuple<int, int, int, int>
#define tiiii tuple<int, int, int, int, int>
#define vpi vector<pi>
#define vtii vector<tii>
#define vtiii vector<tiii>

const int N = (1 << 20), MOD = 1e9 + 7, INF = int(1e18);

int arr[N], poz[N];

vpi ans;

bool vis[N];
int cnt, e;

int md(int x, int m){
    if(x == m) return x;
    if(x == 2 * m) return m;
    return x % m;
}
queue<int> cur;
bool empt(int x){
    return (arr[x] == 0);
}
int psh(){
    while(!cur.empty() && !empt(cur.front())) cur.pop();
    if(cur.empty()) return -1;
    return cur.front();
}

int wsk[N], k[N];
vi z[N];
bool st[N], gd[N];

void mv(int x, int p, int m, int n){
    p = md(p, m);
    int v = md(poz[x], m);
    if(poz[x] > m) cur.push(poz[x]);
    ans.pb({v, p});
    if(arr[p + m] == 0){
        arr[p + m] = x;
        arr[poz[x]] = 0;
        poz[x] = p + m;
    }else{
        arr[p] = x;
        arr[poz[x]] = 0;
        poz[x] = p;
        gd[md(x, n)] = 1;
        cnt--;
    }
}

bool check_clr(int c, int n, int m){
    c = md(c, n);
    if(gd[c]) return 1;
    int a = c, b = c + n;
    if(poz[a] > poz[b]) swap(a, b);
    int x = poz[a], y = poz[b];
    if(x > m && arr[x - m] != 0) return 0;
    if(y > m && arr[y - m] != 0) return 0;
    if(y <= m) return 0;
    mv(a, y, m, n);
    if(x <= m){
        check_clr(md(arr[x + m], n), n, m);
    }
    return 1;
}

int dfs(int x, int u, int m, int n){
    if(vis[x]){
        if(k[x] == 0) k[x] = x;
        return k[x];
    }
    vis[x] = 1;
    if(u <= m){
        wsk[x] = arr[u + m];
        st[arr[u + m]] = 1;
        k[x] = dfs(arr[u + m], u + m, m, n);
        return k[x];
    }
    int a;
    if(x > n) a = x - n;
    else a = x + n;
    if(poz[a] <= m){
        wsk[x] = a;
        st[a] = 1;
        k[x] = dfs(a, poz[a], m, n);
        return k[x];
    }
    wsk[x] = a;
    st[a] = 1;
    k[x] = a;
    return k[x];
    
}   

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(NULL); cout.tie(NULL);
    // random_device rd;
    // mt19937_64 gen(rd());
    int n, m;
    cin >> n >> m;
    cnt = n;
    for(int i = 1; i <= m; i++){
        cin >> arr[i + m] >> arr[i];
        if(vis[arr[i]]) arr[i] += n;
        if(arr[i] != 0) vis[arr[i]] = 1;
        if(vis[arr[i + m]]) arr[i + m] += n;
        vis[arr[i + m]] = 1;
        poz[arr[i]] = i;
        poz[arr[i + m]] = i + m;
        vis[0] = 0;
    }

    for(int i = 1; i <= n; i++){
        if(poz[i] % m != poz[i + n] % m) vis[i] = 0;
        else{
            cnt--;
            gd[i] = 1;
        }
    }
    for(int i = 1; i <= n; i++){
        if(!gd[i]) check_clr(i, n, m);
    }
    for(int i = 1; i <= m; i++){
        if(empt(i + m)) cur.push(i + m);
    }
    if(cnt > 0 && psh() == -1){
        cout << "-1\n";
        return 0;
    }
    gd[0] = 1;
    for(int i = 1; i <= 2 * n; i++) vis[i] = 0;
    for(int i = 1; i <= m; i++){
        if(empt(i)) continue;
        dfs(arr[i], i, m, n);
    }
    for(int i = 1; i <= 2 * n; i++){
        if((st[i] && k[i] != i) || gd[md(i, n)] || wsk[i] == 0) continue;
        if((md(i, n) == md(k[i], n)) || empt(poz[k[i]] - m)){
            int x = poz[i];
            e = psh();
            mv(i, e, m, n);
            check_clr(md(i, n), n, m);
            check_clr(md(arr[x + m], n), n, m);
        }else{
            int x = md(k[i], n);
            if(!z[x].empty() && md(z[x].front(), n) == md(i, n)){
                int a = poz[i];
                e = psh();
                mv(i, e, m, n);
                check_clr(md(i, n), n, m);
                check_clr(md(arr[a + m], n), n, m);
                z[x].clear();
            }else{
                z[md(k[i], n)].pb(i);
            }
        }
    }
    for(int i = 1; i <= n; i++){
        if(z[i].empty()) continue;
        if(int(z[i].size()) == 2 && !gd[md(z[i][0], n)] && !gd[md(z[i][1], n)]) continue;
        if((int(z[i].size()) == 1 && gd[md(z[i][0], n)]) || (int(z[i].size()) == 2 && gd[md(z[i][0], n)] && gd[md(z[i][1], n)])){
            z[i].clear();
            continue;
        }
        int a;
        if(!gd[md(z[i][0], n)] || int(z[i].size() == 1)) a = z[i][0];
        else a = z[i][1];
        int x = poz[a];
        e = psh();
        mv(a, e, m, n);
        check_clr(md(a, n), n, m);
        check_clr(md(arr[x + m], n), n, m);
        z[i].clear();
    }
    e = psh();
    while(!cur.empty() && cur.front() == e) cur.pop();
    if(cnt > 0 && psh() == -1){
        cout << "-1\n";
        return 0;
    }
    cur.push(e);
    for(int i = 1; i <= n; i++){
        if(z[i].empty()) continue;
        int x;
        if(!gd[md(z[i][0], n)]){
            x = poz[z[i][0]];
            mv(z[i][0], psh(), m, n);
            check_clr(md(arr[x + m], n), n, m);
            check_clr(md(z[i][0], n), n, m);
        }
        if(!gd[md(z[i][1], n)]){
            x = poz[z[i][1]];
            mv(z[i][1], psh(), m, n);
            check_clr(md(arr[x + m], n), n, m);
            check_clr(z[i][1], n, m);
        }
    }
    cout << int(ans.size()) << "\n";
    for(auto [i, j] : ans) cout << i << ' ' << j << "\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...