제출 #316559

#제출 시각아이디문제언어결과실행 시간메모리
316559mohamedsobhi777정렬하기 (IOI15_sorting)C++14
36 / 100
2 ms640 KiB
#include <bits/stdc++.h> #include "sorting.h" using namespace std; const int _N = 2e5; int n, m; int s[_N], _s[_N]; int x[_N], y[_N]; int nxt[_N]; int t; int viz[_N]; int Nxt[_N]; int cyc = 0; int pos[_N]; int rep[_N]; int cycles() { ++t; int ret = 0; for (int i = 0; i < n; ++i) { int cnt = 1; int cur = Nxt[i]; if (viz[i] == t) continue; ++ret; while (cur != i) { viz[cur] = t; cur = Nxt[cur]; ++cnt; } viz[cur] = t; } return ret; } vector<pair<int, int>> ans, ans2; void solve(int X) { map<int, int> vis; for (int i = 0; i < n; ++i) { if (vis[i]) continue; int cur = Nxt[i]; while (cur != i) { ++vis[cur]; ans.push_back({i, cur}); cur = Nxt[cur]; } ++vis[cur]; } while (ans.size() < X) ans.push_back({0, 0}); ans2.resize(X); for (int i = 0; i < n; ++i) pos[s[i]] = i; for (int i = 0; i < X; ++i) { int x1 = pos[_s[x[i]]]; int x2 = pos[_s[y[i]]]; swap(rep[x1], rep[x2]); ans2[i] = {rep[ans[i].first], rep[ans[i].second]}; swap(_s[x[i]], _s[y[i]]); } } bool can(int mid) { int nxt[_N]; for (int i = 0; i < n; ++i) nxt[i] = s[i]; for (int j = 0; j <= mid; ++j) swap(nxt[x[j]], nxt[y[j]]); ++t; int ret = 0; for (int i = 0; i < n; ++i) { int cur = nxt[i]; if (viz[i] == t) continue; ++ret; while (cur != i) { viz[cur] = t; cur = nxt[cur]; } viz[cur] = t; } return n - ret <= mid; } int binary_sr4() { int ret = m; int lo = 0, hi = m; while (lo <= hi) { int mid = (lo + hi) >> 1; if (can(mid)) hi = mid - 1, ret = mid; else lo = mid + 1; } return ret; } 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) { Nxt[i] = S[i]; s[i] = S[i]; _s[i] = S[i]; rep[i] = i; } cyc = cycles(); if (n - cyc == 0) return 0; int opt = binary_sr4(); for (int i = 0; i < M; ++i) { x[i] = X[i]; y[i] = Y[i]; swap(s[X[i]], s[Y[i]]); swap(rep[X[i]], rep[Y[i]]); swap(Nxt[X[i]], Nxt[Y[i]]); if (abs(i - opt) <= 50 && n - cycles() <= i + 1) { solve(i + 1); for (int j = 0; j <= i; ++j) { P[j] = ans2[j].first; Q[j] = ans2[j].second; } return ++i; } } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

sorting.cpp: In function 'void solve(int)':
sorting.cpp:57:27: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   57 |         while (ans.size() < X)
      |                ~~~~~~~~~~~^~~
sorting.cpp: In function 'bool can(int)':
sorting.cpp:76:19: warning: declaration of 'nxt' shadows a global declaration [-Wshadow]
   76 |         int nxt[_N];
      |                   ^
sorting.cpp:10:5: note: shadowed declaration is here
   10 | int nxt[_N];
      |     ^~~
#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...