Submission #989190

#TimeUsernameProblemLanguageResultExecution timeMemory
989190crafticatSorting (IOI15_sorting)C++17
36 / 100
104 ms1188 KiB
#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 = ans.size(); i < m; ++i) { int j = posPoint[(i - ans.size()) % 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)) return {}; 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 (stderr)

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 'std::vector<std::pair<int, int> > solve(int)':
sorting.cpp:63:26: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   63 |     for (int i = ans.size(); i < m; ++i) {
      |                  ~~~~~~~~^~
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:120: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]
  120 |         for (int j = 0; j < v.size(); ++j) {
      |                         ~~^~~~~~~~~~
sorting.cpp:123: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]
  123 |         for (int j = 0; j < v.size(); ++j) {
      |                         ~~^~~~~~~~~~
sorting.cpp:126:22: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  126 |         return v.size();
      |                ~~~~~~^~
sorting.cpp:118:21: warning: control reaches end of non-void function [-Wreturn-type]
  118 |     auto v = solve(l);
      |                     ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...