Submission #434024

#TimeUsernameProblemLanguageResultExecution timeMemory
434024pliamSorting (IOI15_sorting)C++14
100 / 100
544 ms23372 KiB
#include "sorting.h"
#include <bits/stdc++.h>
using namespace std;
#define MAXN 200005

int from[MAXN];
int from_pos[MAXN];
int s_pos[MAXN];
int n;
int s[MAXN];
int* x;
int* y;
int p[MAXN];
int q[MAXN];

void change_from(int a,int b){
	swap(from_pos[a],from_pos[b]);
	from[from_pos[a]]=a;
	from[from_pos[b]]=b;
}

void swap_s(int a,int b){
	swap(s[a],s[b]);
	s_pos[s[a]]=a;
	s_pos[s[b]]=b;
}

bool check(int r){
	for(int i=0;i<n;i++){
		from[i]=i;
		from_pos[i]=i;
		s_pos[s[i]]=i;
	}
	for(int i=r-1;i>0;i--){
		if(x[i]!=y[i]) change_from(x[i],y[i]);
	}
	int i=0;
	for(int pos=0;pos<r;pos++){
		if(x[pos]!=y[pos]) swap_s(x[pos],y[pos]);

		while(i<n){
			if(s_pos[i]!=from[i]) break;
			i++;
		}
		if(i!=n){
			p[pos]=from[i];
			q[pos]=s_pos[i];
			swap_s(p[pos],q[pos]);
			i++;
		}else{
			p[pos]=0;
			q[pos]=0;
		}
		if((pos<r-1)&&(x[pos+1]!=y[pos+1])) change_from(x[pos+1],y[pos+1]);
	}
	for(int i=0;i<n;i++){
		if(s[i]!=i) return false;
	}
	return true;
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
	n=N;
	x=X;
	y=Y;
	for(int i=0;i<n;i++){
		s[i]=S[i];
	}
	bool sorted=true;
    for(int i=0;i<n;i++){
		if(s[i]!=i) sorted=false;
	}
	if(sorted) return 0;

	int k=N;
	for(int b=N-1;b>0;b/=2){
		while(k-b>0){
			bool ans=check(k-b);
			for(int i=0;i<n;i++){
				s[i]=S[i];
			}
			if(!ans) break;
			k-=b;
		}
	}
	check(k);
	for(int i=0;i<k;i++){
		P[i]=p[i];
		Q[i]=q[i];
	}
	return k;
}


Compilation message (stderr)

sorting.cpp: In function 'bool check(int)':
sorting.cpp:56:10: warning: declaration of 'i' shadows a previous local [-Wshadow]
   56 |  for(int i=0;i<n;i++){
      |          ^
sorting.cpp:37:6: note: shadowed declaration is here
   37 |  int i=0;
      |      ^
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:62:39: warning: unused parameter 'M' [-Wunused-parameter]
   62 | int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
      |                                   ~~~~^
#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...