제출 #46937

#제출 시각아이디문제언어결과실행 시간메모리
46937mAng0정렬하기 (IOI15_sorting)C++17
100 / 100
214 ms13020 KiB
#include "sorting.h" int S2[200001], vis[200001]; int perm[200001], inv[200001]; int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) { //int findSwapPairs(){ int ss = 0, ee = M, R = 0, now = 0; while(ss <= ee){ int mid = (ss+ee) / 2; for(int i=0;i<N;i++){ S2[i] = S[i]; vis[i] = 0; } for(int i=now;i<mid;i++){ int tmp = S2[X[i]]; S2[X[i]] = S2[Y[i]]; S2[Y[i]] = tmp; } int cnt = 0; for(int i=0;i<N;i++){ if(vis[i]) continue; int ii = S2[i]; while(ii != i){ vis[ii] = 1; cnt++; ii = S2[ii]; } } if(cnt <= mid){ R = mid; ee = mid - 1; }else{ now = mid; for(int i=0;i<N;i++) S[i] = S2[i]; ss = mid + 1; } } for(int i=now;i<R;i++){ int tmp = S[X[i]]; S[X[i]] = S[Y[i]]; S[Y[i]] = tmp; } for(int i=0;i<N;i++){ vis[i] = 0; perm[i] = i; inv[i] = i; } int cnt = 0; for(int i=0;i<N;i++){ if(vis[i]) continue; while(S[i] != i){ vis[S[i]] = 1; P[cnt] = i; Q[cnt] = S[i]; int nxt = S[i]; S[i] = S[nxt]; S[nxt] = nxt; cnt++; } } for(int i=R-2;i>=0;i--){ int tmp; int p1 = X[i+1], q1 = Y[i+1]; tmp = perm[p1]; perm[p1] = perm[q1]; perm[q1] = tmp; int p2 = perm[p1], q2 = perm[q1]; tmp = inv[p2]; inv[p2] = inv[q2]; inv[q2] = tmp; P[i] = inv[P[i]]; Q[i] = inv[Q[i]]; } return R; }
#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...