Submission #1287383

#TimeUsernameProblemLanguageResultExecution timeMemory
1287383WH8Sorting (IOI15_sorting)C++20
100 / 100
96 ms14616 KiB
#include "sorting.h" #include <bits/stdc++.h> using namespace std; int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) { int l=-1,r=M; for(int i=0;i<M;i++)P[i]=Q[i]=0; while(l<r-1){ int mid=(l+r)/2; vector<bool> vis(N, 0); vector<int> cur(N); for(int i=0;i<N;i++)cur[i]=S[i]; for(int i=0;i<mid;i++){ swap(cur[X[i]], cur[Y[i]]); } int cycles=0; for(int i=0;i<N;i++){ if(!vis[i]){ cycles++; int c=i; while(true){ vis[c]=true; if(vis[cur[c]])break; c=cur[c]; } } } if(N-cycles <= mid){ r=mid; } else l=mid; } vector<bool> vis(N, 0); vector<int> cur(N); for(int i=0;i<N;i++)cur[i]=S[i]; for(int i=0;i<r;i++){ swap(cur[X[i]], cur[Y[i]]); } vector<pair<int,int>> todo; for(int i=0;i<N;i++){ if(!vis[i]){ int c=i; vis[i]=true; while(true){ vis[c]=true; if(vis[cur[c]])break; todo.push_back({c, cur[c]}); c=cur[c]; } } } vector<int> pos(N); for(int i=0;i<N;i++){ cur[i]=S[i]; pos[cur[i]]=i; } for(int i=0;i<(int)(todo.size());i++){ //~ printf("trying to swap values %d with %d\n", todo[i].first, todo[i].second); pos[cur[X[i]]]=Y[i]; pos[cur[Y[i]]]=X[i]; swap(cur[X[i]], cur[Y[i]]); //~ for(int j=0;j<N;j++){ //~ cout<<cur[j]<<" "; //~ } //~ cout<<endl; P[i]=pos[todo[i].first]; Q[i]=pos[todo[i].second]; swap(cur[pos[todo[i].first]], cur[pos[todo[i].second]]); swap(pos[todo[i].first], pos[todo[i].second]); //~ for(int j=0;j<N;j++){ //~ cout<<cur[j]<<" "; //~ } //~ cout<<endl; } 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...