Submission #1245095

#TimeUsernameProblemLanguageResultExecution timeMemory
1245095caacrugonSorting (IOI15_sorting)C++20
20 / 100
2 ms580 KiB
#include "sorting.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long

ll n;
vector<ll> ln;
vector<pair<ll,ll>> em;

bool possi(ll m){
    vector<ll> a=ln;
    ll limit=m;
    for(ll i=0;i<limit;i++) swap(a[em[i].first],a[em[i].second]);
    int N=n;
    vector<pair<ll,int>> temp;
    for(int i=0;i<N;i++) temp.push_back({a[i],i});
    sort(temp.begin(),temp.end());
    vector<int> p(N);
    for(int i=0;i<N;i++) p[temp[i].second]=i;
    vector<bool> vis(N,false);
    ll cycles=0;
    for(int i=0;i<N;i++) if(!vis[i]){
        int j=i;
        while(!vis[j]){
            vis[j]=true;
            j=p[j];
        }
        cycles++;
    }
    ll min_swaps=N-cycles;
    return min_swaps<=m;
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
    ln.resize(N);
    n=N;
    em.resize(M);
    for(int i=0;i<N;i++){
        ln[i]=S[i];
    }
    for(int i=0;i<M;i++){
        em[i].first=X[i];
        em[i].second=Y[i];
    }
    ll l=0,r=M,ans=M;
    while(l<=r){
        ll m=l+((r-l)/2);
        if(possi(m)){
            ans=m;
            r=m-1;
        }else{
            l=m+1;
        }
    }
    vector<ll> a=ln;
    ll limit=ans;
    for(ll i=0;i<limit;i++) swap(a[em[i].first],a[em[i].second]);
    vector<pair<ll,int>> temp;
    for(int i=0;i<N;i++) temp.push_back({a[i],i});
    sort(temp.begin(),temp.end());
    vector<int> p(N);
    for(int i=0;i<N;i++) p[temp[i].second]=i;
    vector<bool> vis(N,false);
    ll R=0;
    for(int i=0;i<N;i++){ 
      if(!vis[i] && p[i]!=i){
        int cur=i;
        vector<int> ciclo;
        while(!vis[cur]){
            ciclo.push_back(cur);
            vis[cur]=true;
            cur=p[cur];
        }
        for(int j=1;j<ciclo.size();j++){
            P[R]=ciclo[0];
            Q[R]=ciclo[j];
            R++;
        }
      }
    }
    return ans;
}
#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...