# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
989186 | 2024-05-27T17:09:26 Z | crafticat | 정렬하기 (IOI15_sorting) | C++17 | 3 ms | 604 KB |
#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]) 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 = ans.size(); i < m; ++i) { ans.push_back({0,0}); } 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
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 0 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 | 1 ms | 344 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 | 0 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 | 1 ms | 344 KB | Output is correct |
6 | Correct | 0 ms | 348 KB | Output is correct |
7 | Correct | 0 ms | 348 KB | Output is correct |
8 | Correct | 0 ms | 348 KB | Output is correct |
9 | Correct | 0 ms | 348 KB | Output is correct |
10 | Correct | 0 ms | 348 KB | Output is correct |
11 | Correct | 0 ms | 348 KB | Output is correct |
12 | Correct | 0 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 | 0 ms | 348 KB | Output is correct |
4 | Correct | 0 ms | 348 KB | Output is correct |
5 | Correct | 1 ms | 384 KB | Output is correct |
6 | Correct | 0 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 | 0 ms | 348 KB | Output is correct |
4 | Correct | 0 ms | 348 KB | Output is correct |
5 | Correct | 1 ms | 344 KB | Output is correct |
6 | Correct | 0 ms | 348 KB | Output is correct |
7 | Correct | 0 ms | 348 KB | Output is correct |
8 | Correct | 0 ms | 348 KB | Output is correct |
9 | Correct | 0 ms | 348 KB | Output is correct |
10 | Correct | 0 ms | 348 KB | Output is correct |
11 | Correct | 0 ms | 348 KB | Output is correct |
12 | Correct | 0 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 | 0 ms | 348 KB | Output is correct |
16 | Correct | 0 ms | 348 KB | Output is correct |
17 | Correct | 1 ms | 384 KB | Output is correct |
18 | Correct | 0 ms | 348 KB | Output is correct |
19 | Correct | 0 ms | 348 KB | Output is correct |
20 | Correct | 0 ms | 348 KB | Output is correct |
21 | Runtime error | 2 ms | 604 KB | Execution failed because the return code was nonzero |
22 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 3 ms | 604 KB | Execution failed because the return code was nonzero |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 3 ms | 604 KB | Execution failed because the return code was nonzero |
2 | Halted | 0 ms | 0 KB | - |