#include <bits/stdc++.h>
using namespace std;
int n, m;
vector <int> a, b;
int main() {
cin >> n >> m;
a = b = vector <int> (m+1);
for (int i = 1; i <= m; i++)
cin >> a[i] >> b[i];
int ans = 0;
vector <pair <int, int>> steps;
while (true) {
bool done = false;
// first move a top car to the top of another pile
set <pair <int, int>> bottoms;
for (int i = 1; i <= m; i++) {
if (a[i] == b[i])
continue;
if (a[i] == 0)
continue;
if (b[i] == 0)
bottoms.insert({a[i], i});
}
for (int i = 1; i <= m; i++) {
if (a[i] == b[i])
continue;
if (b[i] == 0)
continue;
auto it = bottoms.lower_bound({b[i], 0});
if (it != bottoms.end() && it->first == b[i]) {
ans++;
steps.push_back({i, it->second});
done = true;
b[i] = 0;
b[it->second] = a[it->second];
break;
}
}
if (done)
continue;
// now try to move a[x] to b[y]
set <pair <int, int>> tops;
for (int i = 1; i <= m; i++) {
if (a[i] == b[i])
continue;
if (b[i] == 0 && a[i] != 0) {
auto it = tops.lower_bound({a[i], 0});
if (it != tops.end() && it->first == a[i]) {
ans++;
steps.push_back({it->second, i});
a[i] = 0;
b[it->second] = a[it->second];
done = true;
break;
} else {
tops.insert({a[i], i});
}
}
}
if (done)
continue;
// now try to make a base for a number that doesn't have one
set <int> seen;
int empty = -1;
for (int i = 1; i <= m; i++) {
if (a[i] == 0) {
empty = i;
continue;
}
seen.insert(a[i]);
}
for (int i = 1; i <= m; i++) {
if (b[i] == 0)
continue;
if (b[i] == a[i])
continue;
if (seen.find(b[i]) != seen.end())
continue;
if (empty == -1) {
cout << -1 << '\n';
return 0;
}
steps.push_back({i, empty});
a[empty] = b[i];
b[i] = 0;
ans++;
done = true;
break;
}
if (done)
continue;
// try creating a new base
seen.clear();
empty = -1;
for (int i = 1; i <= m; i++) {
if (a[i] == 0)
empty = i;
else if (a[i] != b[i] && b[i] != 0)
seen.insert(a[i]);
}
if (empty == -1) {
cout << -1 << '\n';
return 0;
}
for (int i = 1; i <= m; i++) {
if (b[i] == 0)
continue;
if (a[i] == b[i])
continue;
auto it = seen.lower_bound(b[i]);
if (it != seen.end() && *it == b[i]) {
done = true;
ans++;
steps.push_back({i, empty});
a[empty] = b[i];
b[i] = 0;
break;
}
}
if (done)
continue;
if (!done)
break;
}
for (int i = 1; i <= m; i++) {
if (a[i] != b[i]) {
cout << -1 << '\n';
return 0;
}
}
cout << ans << '\n';
for (auto i : steps)
cout << i.first << ' ' << i.second << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |