#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
vector<int> x, y;
vector<int> initPos;
int n;
bool check(vector<pii> test) {
vector<int> pos = initPos;
for (int i = 0; i < test.size(); ++i) {
swap(pos[x[i]],pos[y[i]]);
swap(pos[test[i].first],pos[test[i].second]);
}
for (int i = 0; i < n; ++i) {
if (pos[i] != i)
return false;
}
return true;
}
vector<pii> solve(int m) {
vector<int> pos = initPos;
vector<int> posPoint = initPos;
vector<int> orgPosTo(n), orgPos(n);
vector<bool> notSorted(n);
vector<pii> ans;
for (int i = 0; i < n; ++i) {
orgPosTo[i] = i;
}
for (int i = 0;i < m;i++) {
swap(pos[x[i]],pos[y[i]]);
}
for (int i = m - 1; i >=0 ; --i) {
swap(orgPosTo[x[i]],orgPosTo[y[i]]);
}
for (int i = 0; i < n; ++i) {
orgPos[orgPosTo[i]] = i;
}
for (int i = 0; i < n; ++i) {
if (pos[i] != i) notSorted[i] = true;
posPoint[pos[i]] = i;
}
for (int i = 0; i < m; ++i) {
//if (!notSorted[i % n]) continue;
int j = posPoint[i % n];
swap(orgPosTo[x[i]],orgPosTo[y[i]]);
orgPos[orgPosTo[x[i]]] = x[i];
orgPos[orgPosTo[y[i]]] = y[i];
int target = pos[j];
notSorted[target] = false;
swap(pos[target],pos[j]);
for (int k = 0; k < n; ++k) {
posPoint[pos[k]] = k;
}
if (pos[j] == j) notSorted[j] = false;
ans.emplace_back(orgPos[j],orgPos[target]);
}
for (int i = 0; i < n; ++i) {
if (notSorted[i]) return {};
}
if (!check(ans))
exit(5);
return ans;
}
int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
n = N;
x.resize(M);
y.resize(M);
initPos.resize(n);
for (int i = 0; i < M; ++i) {
x[i] = X[i];
}
for (int i = 0; i < M; ++i) {
y[i] = Y[i];
}
for (int i = 0; i < n; ++i) {
initPos[i] = S[i];
}
bool stopIm = true;
for (int i = 0; i < n; ++i) {
if (initPos[i] != i) stopIm = false;
}
if (stopIm) return {};
int l = 0, r = M;
while (l < r) {
int mid = l + (r - l) / 2;
if (solve(mid).empty()) {
l = mid + 1;
} else
r = mid;
}
auto v = solve(l);
if (!v.empty()) {
for (int j = 0; j < v.size(); ++j) {
P[j] = v[j].first;
}
for (int j = 0; j < v.size(); ++j) {
Q[j] = v[j].second;
}
return v.size();
}
}
#if DEBUG
static char _buffer[1024];
static int _currentChar = 0;
static int _charsNumber = 0;
static FILE *_inputFile, *_outputFile;
static inline int _read() {
if (_charsNumber < 0) {
exit(1);
}
if (!_charsNumber || _currentChar == _charsNumber) {
_charsNumber = (int)fread(_buffer, sizeof(_buffer[0]), sizeof(_buffer), _inputFile);
_currentChar = 0;
}
if (_charsNumber <= 0) {
return -1;
}
return _buffer[_currentChar++];
}
static inline int _readInt() {
int x; cin >> x;
return x;
}
int main()
{
_inputFile = fopen("sorting.in", "rb");
_outputFile = fopen("sorting.out", "w");
int N, M;
N = _readInt();
int *S = (int*)malloc(sizeof(int) * (unsigned int)N);
for (int i = 0; i < N; ++i)
S[i] = _readInt();
M = _readInt();
int *X = (int*)malloc(sizeof(int) * (unsigned int)M), *Y = (int*)malloc(sizeof(int) * (unsigned int)M);
for (int i = 0; i < M; ++i) {
X[i] = _readInt();
Y[i] = _readInt();
}
int *P = (int*)malloc(sizeof(int) * (unsigned int)M), *Q = (int*)malloc(sizeof(int) * (unsigned int)M);
int ans = findSwapPairs(N, S, M, X, Y, P, Q);
cout << ans << endl;
for (int i = 0; i < ans; ++i)
cout << P[i] << " " << Q[i] << endl;
return 0;
}
#endif
Compilation message
sorting.cpp: In function 'bool check(std::vector<std::pair<int, int> >)':
sorting.cpp:12:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
12 | for (int i = 0; i < test.size(); ++i) {
| ~~^~~~~~~~~~~~~
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:103:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
103 | for (int j = 0; j < v.size(); ++j) {
| ~~^~~~~~~~~~
sorting.cpp:106:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
106 | for (int j = 0; j < v.size(); ++j) {
| ~~^~~~~~~~~~
sorting.cpp:109:22: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
109 | return v.size();
| ~~~~~~^~
sorting.cpp:101:21: warning: control reaches end of non-void function [-Wreturn-type]
101 | auto v = solve(l);
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
0 ms |
348 KB |
Output is correct |
8 |
Correct |
1 ms |
344 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
1 ms |
344 KB |
Output is correct |
11 |
Correct |
1 ms |
344 KB |
Output is correct |
12 |
Correct |
1 ms |
348 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
344 KB |
Output is correct |
5 |
Correct |
1 ms |
344 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
0 ms |
348 KB |
Output is correct |
8 |
Correct |
1 ms |
344 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
1 ms |
344 KB |
Output is correct |
11 |
Correct |
1 ms |
344 KB |
Output is correct |
12 |
Correct |
1 ms |
348 KB |
Output is correct |
13 |
Correct |
0 ms |
348 KB |
Output is correct |
14 |
Correct |
0 ms |
348 KB |
Output is correct |
15 |
Correct |
1 ms |
348 KB |
Output is correct |
16 |
Correct |
1 ms |
344 KB |
Output is correct |
17 |
Correct |
1 ms |
344 KB |
Output is correct |
18 |
Correct |
0 ms |
348 KB |
Output is correct |
19 |
Correct |
0 ms |
348 KB |
Output is correct |
20 |
Correct |
1 ms |
348 KB |
Output is correct |
21 |
Correct |
12 ms |
800 KB |
Output is correct |
22 |
Correct |
9 ms |
604 KB |
Output is correct |
23 |
Correct |
12 ms |
856 KB |
Output is correct |
24 |
Correct |
12 ms |
604 KB |
Output is correct |
25 |
Correct |
8 ms |
604 KB |
Output is correct |
26 |
Correct |
14 ms |
600 KB |
Output is correct |
27 |
Correct |
10 ms |
600 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
34 ms |
600 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
34 ms |
600 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |