#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;
}
void mv(int x, int p, int m, int n){
p = md(p, m);
int v = md(poz[x], m);
if(poz[x] > m) e = v;
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;
vis[md(x, n)] = 1;
cnt--;
}
}
bool check_clr(int c, int n, int m){
c = md(c, n);
if(vis[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;
}
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--;
}
for(int i = 1; i <= n; i++){
if(!vis[i]) check_clr(i, n, m);
}
e = -1;
int r = -1;
for(int i = 1; i <= m; i++){
if(arr[i + m] == 0){
e = r = i;
break;
}
}
vis[0] = 1;
while(cnt > 0){
int akt = -1, pom;
for(int i = 1; i <= m; i++){
if(arr[i + m] == 0){
e = r = i;
break;
}
}
if(e == -1){
cout << "-1\n";
return 0;
}
for(int i = 1; i <= n; i++){
if(poz[i] <= m && poz[i + n] <= m){
akt = i;
break;
}
if(!vis[i]) pom = i;
}
if(akt == -1) akt = pom;
int x = poz[akt];
mv(akt, e, m, n);
check_clr(akt, n, m);
if(x <= m) check_clr(arr[x + m], n, m);
if(arr[e + m] != 0){
for(int i = r + 1; i <= m; i++){
if(arr[i + m] == 0){
e = r = i;
break;
}
}
if(arr[e + m] != 0){
e = -1;
}
}
}
cout << int(ans.size()) << "\n";
// for(auto [i, j] : ans) cout << i << ' ' << j << "\n";
return 0;
}
| # | 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... |