#include "sorting.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pi pair<int, int>
#define pl pair<ll, ll>
#define vi vector<int>
#define vl vector<ll>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(),(x).end()
bool check(int n, int s[], int r, int x[], int y[], int p[], int q[]) {
for (int i=0; i<r; i++) {
swap(s[x[i]],s[y[i]]);
swap(s[p[i]],s[q[i]]);
}
bool ok=1;
for (int i=0; i<n; i++) {
ok&=(s[i]==i);
}
return ok;
}
bool sorted(int n, int s[]) {
bool ok=1;
for (int i=0; i<n && ok; i++) {
ok&=(s[i]==i);
}
return ok;
}
int findSwapPairs(int n, int s[], int m, int x[], int y[], int p[], int q[]) {
if (n==1) {
return 0;
}
int ss[n];
for (int i=0; i<n; i++) {
ss[i]=s[i];
}
vector<vi> lst(n,{m});
for (int i=m-1; i>=0; i--) {
if (x[i]!=y[i]) {
lst[x[i]].pb(i);
lst[y[i]].pb(i);
}
}
priority_queue<pi> qu;
for (int i=0; i<n; i++) {
if (s[i]==i) {
continue;
}
qu.push({lst[i].back(),i});
}
int ind=0;
while (!sorted(n,s) && ind<m) {
if (x[ind]!=y[ind]) {
lst[x[ind]].pop_back();
lst[y[ind]].pop_back();
if (s[y[ind]]!=x[ind]) {
qu.push({lst[x[ind]].back(),x[ind]});
}
if (s[x[ind]]!=y[ind]) {
qu.push({lst[y[ind]].back(),y[ind]});
}
}
swap(s[x[ind]],s[y[ind]]);
if (sorted(n,s)) {
p[ind]=0;
q[ind]=0;
ind++;
break;
}
auto [time,i]=qu.top();
qu.pop();
if (s[i]==i || time!=lst[i].back()) {
swap(s[x[ind]],s[y[ind]]);
continue;
}
p[ind]=i;
q[ind]=find(s,s+n,i)-s;
swap(s[p[ind]],s[q[ind]]);
ind++;
}
assert(check(n,ss,ind,x,y,p,q));
return ind;
}
# | 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... |