Submission #879236

#TimeUsernameProblemLanguageResultExecution timeMemory
879236NeroZeinSorting (IOI15_sorting)C++17
100 / 100
215 ms19312 KiB
#include "sorting.h"
#include "bits/stdc++.h"

using namespace std; 

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
  if (is_sorted(S, S + N)) {
    return 0; 
  }
  auto check = [&](int mid) {
    vector<int> finalArray(N);
    for (int i = 0; i < N; ++i) {
      finalArray[i] = S[i];
    }
    for (int i = 0; i < mid; ++i) {
      swap(finalArray[X[i]], finalArray[Y[i]]); 
    }
    vector<int> next(N);
    vector<pair<int, int>> swaps;
    for (int i = 0; i < N; ++i) {
      next[i] = finalArray[i];
    }
    vector<bool> vis(N);
    for (int i = 0; i < N; ++i) {
      if (vis[i] || next[i] == i) continue; 
      int cur = i, nxt = next[i];
      vis[i] = true; 
      while (nxt != i) {
        vis[nxt] = true; 
        swaps.emplace_back(cur, nxt);
        cur = nxt;
        nxt = next[cur]; 
      }
    }
    vector<int> idx(N); 
    vector<int> currentArray(N);
    for (int i = 0; i < N; ++i) {
      idx[S[i]] = i; 
      currentArray[i] = S[i]; 
    }
    auto swapp = [&](int x, int y) {
      swap(idx[x], idx[y]); 
      swap(currentArray[idx[x]], currentArray[idx[y]]); 
    };
    for (int i = 0; i < (int) swaps.size(); ++i) {
      int x = currentArray[X[i]], y = currentArray[Y[i]];
      swapp(x, y); 
      auto [p, q] = swaps[i];
      P[i] = idx[p], Q[i] = idx[q]; 
      swapp(p, q); 
    }
    for (int i = (int) swaps.size(); i < mid; ++i) {
      P[i] = Q[i] = 0; 
    }
    return (int) swaps.size() <= mid; 
  };
  int l = 0, r = M; 
  while (l < r) {
    int mid = (l + r) / 2;
    if (check(mid)) {
      r = mid; 
    } else {
      l = mid + 1; 
    }
  }
  check(l); 
  return 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...