Submission #1213926

#TimeUsernameProblemLanguageResultExecution timeMemory
1213926TobParking (CEOI22_parking)C++20
0 / 100
2095 ms7104 KiB
#include <bits/stdc++.h>

#define F first
#define S second
#define all(x) x.begin(), x.end()
#define pb push_back
#define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)

using namespace std;

typedef long long ll;
typedef pair <int, int> pii;

const int N = 2e5 + 7;

int n, m, nn;
int c[N], d[N], asi[N], bio[2*N];
int a[N][2];
queue <int> q, q2, fr;
vector <pii> res;

void move(int x, int y) {
	res.pb({x, y});
	if (!fr.empty() && fr.front() == y) fr.pop();
	if (asi[x] == 1) fr.push(x);
	else {
		c[a[x][0]] = 1;
		if (c[a[x][0]^1]) q.push(a[x][0]);
		q2.push(a[x][0]);
	}
	if (asi[y] == 1) nn--, bio[a[y][0]] = bio[a[y][0]^1] = 1;
	a[y][asi[y]++] = a[x][--asi[x]];
}

void kick(int x) {
	int y = a[d[x^1]][1];
	if (asi[d[y]]+asi[d[y^1]] == 4) {
		int frf = fr.front();
		move(d[y], frf);
		move(d[y^1], frf);
	}
	else kick(y);
}

int main () {
	FIO;
	cin >> n >> m;
	
	nn = n;
	for (int i = 0; i < m; i++) {
		int x, y; cin >> x >> y;
		if (x == y && x) {
			nn--;
			continue;
		}
		x--; y--;
		if (x == -1) fr.push(i);
		if (x >= 0) x = 2*x+(bio[x]++), a[i][asi[i]++] = x, c[x] = (y == -1), d[x] = i;
		if (y >= 0) y = 2*y+(bio[y]++), a[i][asi[i]++] = y, c[y] = 1, d[y] = i;
	}
	memset(bio, 0, sizeof bio);
	for (int i = 0; i < n; i++) {
		if (c[2*i] && c[2*i+1]) {
			if (asi[d[2*i]]+asi[d[2*i+1]] < 4) q.push(asi[d[2*i]] == 1 ? 2*i : 2*i+1);
		}
	}
	int ii = 0;
	while (nn) {
		int x = -1;
		if (!q.empty()) x = q.front(), q.pop();
		if (x != -1) {
			if (bio[x]) continue;
			bio[x] = bio[x^1] = 1;
			move(d[x^1], d[x]);
			continue;
		}
		if (fr.empty()) {
			cout << "-1\n";
			return 0;
		}
		if (!q2.empty()) {
			x = q2.front(); q2.pop();
			if (bio[x]) continue;
			kick(x);
		}
		else {
			while (ii < n && !(asi[ii] == 2 && !bio[a[ii][1]])) ii++;
			move(a[ii][1], fr.front());
		}
	}
	cout << res.size() << "\n";
	for (auto it : res) cout << it.F+1 << " " << it.S+1 << "\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...