제출 #1269620

#제출 시각아이디문제언어결과실행 시간메모리
1269620vtnoo정렬하기 (IOI15_sorting)C++20
100 / 100
191 ms22320 KiB
#include <bits/stdc++.h> #define ll int #define sz(x) int(x.size()) #define forn(i,n) for(i=0; i<n; i++) #define all(x) x.begin(),x.end() #define pb push_back #define mp make_pair #define fr first #define se second using namespace std; bool isOrd(vector<ll>&v) { ll i; for(i=0; i<sz(v); i++) if(i!=v[i]) return 0; return 1; } vector<ll>x,y,s; vector<ll>in, m, v, mal; void can(ll M, vector<ll>&P, vector<ll>&Q) { ll N=sz(s); iota(all(in),0); ll i, j, k, l, end=N-1; for(i=M-1; i>=0; i--) swap(in[x[i]],in[y[i]]); v=s; for(i=0; i<N; i++) { if(v[i]!=in[i]) mal[v[i]]=i; else mal[v[i]]=-1; m[in[i]]=i; } for(i=0; i<M; i++) { if(v[x[i]]!=in[x[i]]) mal[v[x[i]]]=-1; if(v[y[i]]!=in[y[i]]) mal[v[y[i]]]=-1; swap(v[x[i]],v[y[i]]); swap(m[in[x[i]]],m[in[y[i]]]); swap(in[x[i]],in[y[i]]); if(v[x[i]]!=in[x[i]]) mal[v[x[i]]]=x[i]; if(v[y[i]]!=in[y[i]]) mal[v[y[i]]]=y[i]; while(end>=0&&mal[end]==-1) end--; if(end>=0) { k=mal[end]; l=m[v[k]]; mal[end]=-1; mal[v[l]]=-1; if(v[l]!=in[k]) mal[v[l]]=k; swap(v[k],v[l]); P[i]=k; Q[i]=l; } else { P[i]=0; Q[i]=0; } } while(end>=0&&mal[end]==-1) end--; if(end<0) return; P[0]=-1; } int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) { ll l=1, r=(N)-1, piv, pos=(N), i; in.resize(N); m.resize(N); x.resize(M); y.resize(M); mal.resize(N); for(i=0; i<M; i++) { x[i]=X[i]; y[i]=Y[i]; } s.resize(N); for(i=0; i<N; i++) s[i]=S[i]; if(isOrd(s)) return 0; vector<ll>a(M),b(M); while(l<=r) { piv=(l+r)/2; can(piv,a,b); if(a[0]!=-1) { pos=piv; r=piv-1; } else l=piv+1; } vector<ll>p(pos),q(pos); can(pos,p,q); for(i=0; i<sz(p); i++) { P[i]=p[i]; Q[i]=q[i]; } return pos; }
#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...