Submission #1255347

#TimeUsernameProblemLanguageResultExecution timeMemory
1255347lambd47Sorting (IOI15_sorting)C++20
100 / 100
200 ms15336 KiB
#include"sorting.h" #include<bits/stdc++.h> using namespace std; int n; int dist(vector<int> a, vector<int> b){ vector<int> marc(a.size(),0); vector<int> rb(b.size()); for(int i=0;i<n;i++){ rb[b[i]]=i; } int d=n; for(int i=0;i<n;i++){ int at=a[i]; if(marc[at])continue; d--; while(!marc[at]){ marc[at]=1; at=a[rb[at]]; } } return d; } int findSwapPairs(int N, int s[], int M, int x[], int y[], int P[], int Q[]){ n=N; vector<int> ord(n); vector<int> vec(n); for(int i=0;i<n;i++)vec[i]=s[i]; int l=0;int r=n+1; while(l<=r){ int m=(l+r)/2; iota(ord.begin(),ord.end(),0); for(int i=m-1;i>=0;i--){ swap(ord[x[i]],ord[y[i]]); } int d=dist(vec,ord); if(d<=m){ r=m-1; } else{ l=m+1; } } int rp=r+1; iota(ord.begin(),ord.end(),0); for(int i=rp-1;i>=0;i--){ swap(ord[x[i]],ord[y[i]]); } vector<int> marc(n,0); vector<pair<int,int>> trocas; vector<int> rv(n); for(int i=0;i<n;i++){ rv[vec[i]]=i; } for(int i=0;i<n;i++){ if(marc[ord[i]])continue; int at=ord[i]; marc[at]=1; int vai=ord[rv[at]]; if(at==vai)continue; while(vai!=ord[i]){ marc[vai]=1; trocas.push_back({at,vai}); at=vai; vai=ord[rv[vai]]; } } vector<int> at(n); vector<int> onde(n); vector<pair<int,int>> resp; at=vec; for(int i=0;i<n;i++){ onde[at[i]]=i; } for(int i=0;i<trocas.size();i++){ swap(at[x[i]],at[y[i]]); swap(onde[at[x[i]]],onde[at[y[i]]]); resp.push_back({onde[trocas[i].first],onde[trocas[i].second]}); } while(resp.size()!=rp){ resp.push_back({0,0}); } for(int i=0;i<rp;i++){ P[i]=resp[i].first; Q[i]=resp[i].second; } return rp; }
#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...