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...