Submission #1269222

#TimeUsernameProblemLanguageResultExecution timeMemory
1269222vtnooSorting (IOI15_sorting)C++20
0 / 100
1 ms580 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN=200000;
int E[MAXN], EF[MAXN], F[MAXN];

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]){
    for(int i=0;i<N;i++){
        E[S[i]]=i; //el item S[i] está en la posición i (permutacion actual)
    }
    int S_[N];
    for(int i=0;i<N;i++)S_[i]=S[i];
    for(int i=0;i<M;i++){
        swap(S_[X[i]], S_[Y[i]]);
    }
    for(int i=0;i<N;i++){
        EF[S_[i]]=i;
        F[i]=E[S_[i]]; //el item S[i] va a terminar en la posicion i 
    }
    for(int i=0;i<M;i++)P[i]=Q[i]=0;
    int cur=0, j=0;
    auto merge=[&](int a, int b, int aa, int bb){
        E[a]=bb;
        E[b]=aa;
        F[EF[a]]=E[b];
        F[EF[b]]=E[a];
    };
    for(int i=0;i<M;i++){ //a medida que avanzamos tenemos que updatear los arrays
        int a=S[X[i]], b=S[Y[i]];
        swap(S[X[i]], S[Y[i]]);
        merge(a,b,X[i],Y[i]);
        while(cur<N&&E[cur]==F[cur])cur++;
        if(E[cur]!=F[cur]){
            int aa=cur, bb=S[F[cur]];
            P[j]=E[cur];
            Q[j++]=F[cur];
            swap(S[E[cur]], S[F[cur]]);
            merge(aa,bb,E[cur],F[cur]);
        }
    }
    /* for(int i=0;i<N;i++){
        cout<<S[i]<<" ";
    }
    cout<<endl; */
    return M;
}
#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...