#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 ans=0, cur=0, j=0;
auto merge=[&](int a, int b, int aa, int bb){
E[a]=bb;
E[b]=aa;
F[EF[a]]=bb;
F[EF[b]]=aa;
};
for(int i=0;i<M;i++){ //a medida que avanzamos tenemoos 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];
E[cur]=F[cur];
swap(S[E[cur]], S[F[cur]]);
merge(aa,bb,E[cur],F[cur]);
}
}
return M;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |