Submission #288420

#TimeUsernameProblemLanguageResultExecution timeMemory
288420KastandaSorting (IOI15_sorting)C++11
100 / 100
206 ms17832 KiB
// M #include<bits/stdc++.h> #include "sorting.h" using namespace std; const int N = 200005 * 3; int n, m, S[N], X[N], Y[N]; int A[N], M[N], Rev[N]; inline bool Solve(int md) { for (int i = 0; i < n; i ++) A[i] = S[i], M[i] = 0; for (int i = 0; i < md; i ++) swap(A[X[i]], A[Y[i]]); int Cnt = 0; for (int i = 0; i < n; i ++) if (!M[i]) { int nw = i; while (!M[nw]) M[nw] = 1, nw = A[nw]; Cnt ++; } Cnt = n - Cnt; return Cnt <= md; } int findSwapPairs(int _n, int _S[], int _m, int _X[], int _Y[], int P[], int Q[]) { n = _n; m = _m; for (int i = 0; i < n; i ++) S[i] = _S[i]; for (int i = 0; i < m; i ++) X[i] = _X[i], Y[i] = _Y[i]; { bool fail = 0; for (int i = 1; i < n; i ++) if (S[i] < S[i - 1]) fail = 1; if (!fail) return 0; } int le = 0, ri = m, md; while (ri - le > 1) { md = (le + ri) >> 1; if (Solve(md)) ri = md; else le = md; } assert(Solve(ri)); for (int i = 0; i < n; i ++) A[i] = S[i], M[i] = 0; for (int i = 0; i < ri; i ++) swap(A[X[i]], A[Y[i]]); vector < pair < int , int > > E; for (int i = 0; i < n; i ++) if (!M[i]) { int nw = i; vector < int > vec; while (!M[nw]) { vec.push_back(nw); M[nw] = 1; nw = A[nw]; } reverse(vec.begin(), vec.end()); for (int j = 1; j < (int)vec.size(); j ++) E.push_back(make_pair(vec[j - 1], vec[j])); } assert(E.size() <= ri); for (int i = 0; i < n; i ++) A[i] = S[i]; for (int i = 0; i < n; i ++) Rev[A[i]] = i; for (int i = 0; i < ri; i ++) { swap(A[X[i]], A[Y[i]]); swap(Rev[A[X[i]]], Rev[A[Y[i]]]); if (!E.size()) { P[i] = Q[i] = 0; continue; } int a = E.back().first; int b = E.back().second; E.pop_back(); int ra = Rev[a]; int rb = Rev[b]; P[i] = ra; Q[i] = rb; swap(A[ra], A[rb]); swap(Rev[A[ra]], Rev[A[rb]]); } return ri; }

Compilation message (stderr)

In file included from /usr/include/c++/9/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/9/bits/stdc++.h:33,
                 from sorting.cpp:2:
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:77:25: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   77 |         assert(E.size() <= ri);
      |                ~~~~~~~~~^~~~~
#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...