Advertisement
Guest User

Sorting

a guest
Jun 24th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.57 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include "sorting.h"
  3.  
  4. using namespace std;
  5.  
  6. const int MAXN = 600005;
  7.  
  8. int n, m, cnt;
  9. int p[2][MAXN], x[MAXN], y[MAXN];
  10. int pos[2][MAXN], kraj[MAXN], org[MAXN];
  11. int solx[MAXN], soly[MAXN];
  12.  
  13. void genKraj (int br) {
  14.     for (int i=0; i<n; i++) {
  15.         kraj[i] = i;
  16.     }
  17.     for (int i=0; i<br; i++) {
  18.         swap(kraj[x[i]], kraj[y[i]]);
  19.     }
  20. }
  21.  
  22. void f (int a, int b, int ind) {
  23.     int va = p[ind][a], vb = p[ind][b];
  24.     p[ind][a] = vb; p[ind][b] = va;
  25.     pos[ind][va] = b; pos[ind][vb] = a;
  26. }
  27.  
  28. bool moze (int br) {
  29.     genKraj(br);
  30.     for (int i=0; i<n; i++) {
  31.         p[0][i] = org[i];
  32.         p[1][i] = i;
  33.         pos[0][p[0][i]] = i;
  34.         pos[1][p[1][i]] = i;
  35.     }
  36.     int t = 0;
  37.     for (int i=0; i<br; i++) {
  38.         f(x[i], y[i], 0); f(x[i], y[i], 1);
  39.         while (t < n && pos[0][t] == pos[1][kraj[t]]) t++;
  40.         if (t == n) {
  41.             solx[i] = soly[i] = 0;
  42.         } else {
  43.             solx[i] = pos[0][t];
  44.             soly[i] = pos[1][kraj[t]];
  45.             f(pos[0][t], pos[1][kraj[t]], 0);
  46.         }
  47.     }
  48.     for (int i=0; i<n; i++) {
  49.         if (p[0][i] != i) return 0;
  50.     }
  51.     return 1;
  52. }
  53.  
  54. int bs () {
  55.     int low = 0, high = m;
  56.     while (low < high) {
  57.         int mid = (low + high) / 2;
  58.         if (moze(mid)) {
  59.             high = mid;
  60.         } else {
  61.             low = mid + 1;
  62.         }
  63.     }
  64.     moze(low);
  65.     return low;
  66. }
  67.  
  68. int findSwapPairs (int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
  69.     n = N; m = M;
  70.     for (int i=0; i<n; i++) {
  71.         org[i] = S[i];
  72.         if (org[i] == i) cnt++;
  73.     }
  74.     if (cnt == n) return 0;
  75.     for (int i=0; i<m; i++) {
  76.         x[i] = X[i]; y[i] = Y[i];
  77.     }
  78.     cnt = bs();
  79.     for (int i=0; i<cnt; i++) {
  80.         P[i] = solx[i]; Q[i] = soly[i];
  81.     }
  82.     return cnt;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement