Submission #1135592

#TimeUsernameProblemLanguageResultExecution timeMemory
1135592LuvidiSorting (IOI15_sorting)C++20
100 / 100
121 ms12588 KiB
#include <bits/stdc++.h>
#include "sorting.h"
using namespace std;

int findSwapPairs(int n, int s[], int m, int x[], int y[], int p[], int q[]) {
	int l=0,r=m;
	while(l<r){
		int mid=(l+r)/2;
		int a[n];
		for(int i=0;i<n;i++)a[i]=s[i];
		for(int i=0;i<mid;i++)swap(a[x[i]],a[y[i]]);
		vector<pair<int,int>> v;
		int idx[n];
		for(int i=0;i<n;i++)idx[a[i]]=i;
		for(int i=0;i<n;i++)if(a[i]!=i){
			v.push_back({i,idx[i]});
			swap(a[i],a[idx[i]]);
			swap(idx[a[i]],idx[a[idx[i]]]);
		}
		if(v.size()<=mid)r=mid;
		else l=mid+1;
	}
	m=l;
	int a[n];
	for(int i=0;i<n;i++)a[i]=s[i];
	for(int i=0;i<m;i++)swap(a[x[i]],a[y[i]]);
	vector<pair<int,int>> v;
	int idx[n];
	for(int i=0;i<n;i++)idx[a[i]]=i;
	for(int i=0;i<n;i++)if(a[i]!=i){
		v.push_back({i,idx[i]});
		swap(a[i],a[idx[i]]);
		swap(idx[a[i]],idx[a[idx[i]]]);
	}
	iota(a,a+n,0);
	iota(idx,idx+n,0);
	while(v.size()<m)v.push_back({0,0});
	for(int i=m-1;i>-1;i--){
		auto[i1,i2]=v[i];
		p[i]=idx[i1];
		q[i]=idx[i2];
		swap(a[x[i]],a[y[i]]);
		swap(idx[a[x[i]]],idx[a[y[i]]]);
	}
	return m;
}
#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...