Submission #1269236

#TimeUsernameProblemLanguageResultExecution timeMemory
1269236vtnoo정렬하기 (IOI15_sorting)C++20
0 / 100
1 ms584 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[E[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){ swap(F[EF[E[a]]], F[EF[E[b]]]); swap(E[a], E[b]); }; /* for(int i=0;i<N;i++){ cout<<i<<" "<<E[i]<<" "<<F[i]<<endl; } */ 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); 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); cur++; } while(cur<N&&E[cur]==F[cur])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...