Submission #1122300

#TimeUsernameProblemLanguageResultExecution timeMemory
1122300epicci23Sorting (IOI15_sorting)C++17
100 / 100
247 ms31064 KiB
#include "bits/stdc++.h"
#include "sorting.h"
#define all(v) v.begin() , v.end()
#define sz(a) (int)a.size()
using namespace std;

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]){
  int n,q;
  n = N , q = M;
  int ar[n+5];
  for(int i=1;i<=n;i++) ar[i] = S[i-1]+1;
  array<int,2> v[q+5];
  for(int i=1;i<=q;i++) v[i][0] = X[i-1]+1 , v[i][1] = Y[i-1]+1;
  
  int l=0,r=q;
  vector<array<int,2>> ans;

  while(l<r){
    int m=(l+r)/2;
    int ta[n+5],tb[n+5],a[n+5],b[n+5];
    vector<array<int,2>> lol;
    for(int i=1;i<=n;i++) ta[i]=tb[i]=i;
    for(int i=1;i<=n;i++) a[i]=ar[i];
    for(int i=1;i<=n;i++) b[ar[i]]=i;

    for(int i=m;i>=1;i--){
      int s1 = v[i][0] , s2 = v[i][1];
      int v1 = ta[s1] , v2 = ta[s2];
      swap(ta[s1],ta[s2]);
      tb[v1] = s2;
      tb[v2] = s1;
    }
   
    int p = n;

    for(int i=1;i<=m;i++){
      int s1 = v[i][0] , s2 = v[i][1];
      int v1 = ta[s1] , v2 = ta[s2];
      swap(ta[s1],ta[s2]);
      tb[v1] = s2;
      tb[v2] = s1;

      v1 = a[s1] , v2 = a[s2];
      swap(a[s1],a[s2]);
      b[v1] = s2;
      b[v2] = s1;

      while(p>=1 && b[p] == tb[p]) p--;

      if(p==0) lol.push_back({1,1});
      else{
      	lol.push_back({b[p],tb[p]});

      	s1 = b[p] , s2 = tb[p];
        v1 = a[s1] , v2 = a[s2];
        swap(a[s1],a[s2]);
        b[v1] = s2;
        b[v2] = s1;

        p--;
      }
    }

    while(p>=1 && b[p] == tb[p]) p--;

    if(p==0){
      r = m;
      ans = lol;
    }
    else l = m + 1;
  }
   
  for(int i = 0 ; i < l ; i++){
  	P[i] = ans[i][0] - 1;
  	Q[i] = ans[i][1] - 1;
  }

  return l;
}

/*void _(){
  int n,q;
  cin >> n >> q;
  int ar[n+5];
  for(int i=1;i<=n;i++) cin >> ar[i];
  array<int,2> v[q+5];
  for(int i=1;i<=q;i++) cin >> v[i][0] >> v[i][1];
  
  int l=0,r=q;
  vector<array<int,2>> ans;

  while(l<r){
    int m=(l+r)/2;
    int ta[n+5],tb[n+5],a[n+5],b[n+5];
    vector<array<int,2>> lol;
    for(int i=1;i<=n;i++) ta[i]=tb[i]=i;
    for(int i=1;i<=n;i++) a[i]=ar[i];
    for(int i=1;i<=n;i++) b[ar[i]]=i;

    for(int i=m;i>=1;i--){
      int s1 = v[i][0] , s2 = v[i][1];
      int v1 = ta[s1] , v2 = ta[s2];
      swap(ta[s1],ta[s2]);
      tb[v1] = s2;
      tb[v2] = s1;
    }
   
    int p = n;

    for(int i=1;i<=m;i++){
      int s1 = v[i][0] , s2 = v[i][1];
      int v1 = ta[s1] , v2 = ta[s2];
      swap(ta[s1],ta[s2]);
      tb[v1] = s2;
      tb[v2] = s1;

      v1 = a[s1] , v2 = a[s2];
      swap(a[s1],a[s2]);
      b[v1] = s2;
      b[v2] = s1;

      while(p>=1 && b[p] == tb[p]) p--;

      if(p==0) lol.push_back({1,1});
      else{
      	lol.push_back({b[p],tb[p]});

      	s1 = b[p] , s2 = tb[p];
        v1 = a[s1] , v2 = a[s2];
        swap(a[s1],a[s2]);
        b[v1] = s2;
        b[v2] = s1;

        p--;
      }
    }

    while(p>=1 && b[p] == tb[p]) p--;

    if(p==0){
      r = m;
      ans = lol;
    }
    else l = m + 1;
  }
  
  cout << l << '\n';
  for(auto x:ans) cout << x[0] << ' ' << x[1] << '\n';
}

int32_t main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tc=1;//cin >> tc;
  while(tc--) _();
  return 0;
}*/


#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...