Submission #1226277

#TimeUsernameProblemLanguageResultExecution timeMemory
1226277abdelhakimSorting (IOI15_sorting)C++20
100 / 100
291 ms27832 KiB
#include "sorting.h"
#include <bits/stdc++.h>
#define dbg(x) cerr << #x << ' ' <<x << endl;
#define ll long long
using namespace std;
vector<ll> ind;
vector<ll> dest;
vector<ll> recip;
vector<ll> s;
bool is_sorted()
{
	for (int i=0;i<s.size();i++)
	{
		if(s[i]!=i) return false;
	}
	return true;
}
void swp(ll i, ll j)
{
	swap(s[i],s[j]);
	swap(ind[s[i]],ind[s[j]]);
	swap(dest[s[i]],dest[s[j]]);
	recip[dest[s[i]]]=s[i];
	recip[dest[s[j]]]=s[j];
}
int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
    P[0] = 0;
	Q[0] = 0;
	ind.resize(N);
	dest.resize(N);
	recip.resize(N);
	for (int i=0;i<N;i++)
	{
		s.push_back(S[i]);
	}
	if(is_sorted())
	{
		for (int i=0;i<M;i++)
		{
			P[i]=0;
			Q[i]=0;
		}
		return 0;
	}
	ll l=1;
	ll r=M;
	ll mine=M;
	while(l<=r)
	{
		ll mid=(l+r)>>1;
		for (int i=0;i<N;i++)
		{
			s[i]=S[i];
			ind[s[i]]=i;
		}
		vector<ll> p(M);
		vector<ll> q(M);
		for (int i=0;i<M;i++) 
		{
			p[i]=0;
			q[i]=0;
		}
		vector<ll> l3iba(N);
		for (int i=0;i<N;i++) l3iba[i]=s[i];
		for (int i=0;i<mid;i++)
		{
			swap(l3iba[X[i]],l3iba[Y[i]]);
		}
		for (int i=0;i<N;i++)
		{
			dest[l3iba[i]]=i;
			recip[dest[l3iba[i]]]=l3iba[i];
		}
		ll cur=0;
		for (int i=0;i<mid;i++)
		{
			swap(s[X[i]],s[Y[i]]);
			swap(ind[s[X[i]]],ind[s[Y[i]]]);
			for (;cur<N;cur++)
			{
				if(dest[cur]!=cur)
				{
					p[i]=ind[cur];
					q[i]=ind[recip[cur]];
					swp(p[i],q[i]);
					cur++; 
					break;
				}
			}
		}
		if(is_sorted())
		{
			mine=mid;
			for (int i=0;i<M;i++)
			{
				P[i]=p[i];
				Q[i]=q[i];
			}
			r=mid-1;
		}
		else
		{
			l=mid+1;
		}
	}
	return mine;
}
#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...