제출 #119283

#제출 시각아이디문제언어결과실행 시간메모리
119283eohomegrownapps정렬하기 (IOI15_sorting)C++14
100 / 100
193 ms21028 KiB
#include "sorting.h"
#include <bits/stdc++.h>
using namespace std;

int howManySwaps(int check, int N, vector<int> S, int* X, int* Y, vector<int> el2ind){
	//cout<<"how many "<<check<<endl;
	for (int i = 0; i<check; i++){
		int tmp = S[X[i]];
		S[X[i]]=S[Y[i]];
		S[Y[i]]=tmp;
		tmp = el2ind[S[Y[i]]];
		el2ind[S[Y[i]]]=el2ind[S[X[i]]];
		el2ind[S[X[i]]]=tmp;
		/*for (int t=0; t<N; t++){
		cout<<S[t]<<" ";
	}cout<<endl;*/
	}
	//cout<<"done"<<endl;
	int swaps = 0;
	/*for (int t=0; t<N; t++){
		cout<<S[t]<<" ";
	}cout<<endl;*/
	for (int i = 0; i<N; i++){
		if (S[i]==i){
			continue;
		}
		//swapping S[i] and S[el2ind[i]]
		int a = el2ind[S[el2ind[i]]], b = el2ind[S[i]], c=S[i], d=S[el2ind[i]];
		int tmp = S[i];
		S[i]=i;
		S[el2ind[i]]=tmp;
		el2ind[c]=a;
		el2ind[d]=b;
		swaps++;
		/*for (int t=0; t<N; t++){
		cout<<S[t]<<" ";
	}cout<<endl;*/
	}
	//cout<<swaps<<endl;
	return swaps;
}

vector<pair<int,int> > answer;

void pushToAns(int check, int N, vector<int> S, int* X, int* Y, vector<int> el2ind){
	//cout<<"how many "<<check<<endl;
	for (int i = 0; i<check; i++){
		int tmp = S[X[i]];
		S[X[i]]=S[Y[i]];
		S[Y[i]]=tmp;
		tmp = el2ind[S[Y[i]]];
		el2ind[S[Y[i]]]=el2ind[S[X[i]]];
		el2ind[S[X[i]]]=tmp;
	}
	int swaps = 0;
	/*for (int t=0; t<N; t++){
		cout<<S[t]<<" ";
	}cout<<endl;*/
	for (int i = 0; i<N; i++){
		if (S[i]==i){
			continue;
		}
		answer.push_back(make_pair(i,el2ind[i]));
		//swapping S[i] and S[el2ind[i]]
		int a = el2ind[S[el2ind[i]]], b = el2ind[S[i]], c=S[i], d=S[el2ind[i]];
		int tmp = S[i];
		S[i]=i;
		S[el2ind[i]]=tmp;
		el2ind[c]=a;
		el2ind[d]=b;
		swaps++;
		/*for (int t=0; t<N; t++){
		cout<<S[t]<<" ";
	}cout<<endl;*/
	}
	//cout<<swaps<<endl;
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
	vector<int> seq(S,S+N);
	vector<int> el2ind(N,0);
	for (int i = 0; i<N; i++){
		el2ind[seq[i]]=i;
	}
	//binary search
	int l = 0, r = M;
	//find first element with success
	int count,mid;
	while (l<=r){
		//cout<<l<<" "<<r<<endl;
		mid = (l+r)/2;
		count = howManySwaps(mid,N,seq,X,Y,el2ind);
		//cout<<count<<" "<<mid<<endl;
		if (count<=mid){
			r=mid-1;
		} else {
			l=mid+1;
		}
	}
	pushToAns(l,N,seq,X,Y,el2ind);
	//cout<<"answer"<<endl;
	/*for (auto a : answer){
		cout<<a.first<<" "<<a.second<<endl;
	}*/
	if (count<l){
		for (int i = count; i<l; i++){
			answer.push_back(make_pair(0,0));
		}
	}

	//for (auto a : answer){
	//	cout<<a.first<<" "<<a.second<<endl;
	//}
	//cout<<l<<endl;
	vector<int> swapmap(N);
	for (int i = 0; i<N; i++){
		el2ind[i]=i;
		swapmap[i]=i;
	}
	if (l==0){
		return 0;
	}
	P[l-1]=answer[l-1].first;
	Q[l-1]=answer[l-1].second;
	//cout<<"format"<<endl;
	for (auto a = l-2; a>=0; a--){
		//X[a], Y[a] swapped
		//cout<<X[a+1]<<" "<<Y[a+1]<<endl;
		int ia = el2ind[X[a+1]];
		int ib = el2ind[Y[a+1]];
		//cout<<ia<<" "<<ib<<endl;
		int tmp = swapmap[ia];
		swapmap[ia]=swapmap[ib];
		swapmap[ib]=tmp;
		
		tmp = el2ind[X[a+1]];
		el2ind[X[a+1]]=el2ind[Y[a+1]];
		el2ind[Y[a+1]]=tmp;
		/*for (int t=0; t<N; t++){
			cout<<swapmap[t]<<" ";
		}cout<<endl;
		for (int t=0; t<N; t++){
			cout<<el2ind[t]<<" ";
		}cout<<endl;*/
		P[a]=swapmap[answer[a].first];
		Q[a]=swapmap[answer[a].second];
	}
	return l;
}

컴파일 시 표준 에러 (stderr) 메시지

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:105:2: warning: 'count' may be used uninitialized in this function [-Wmaybe-uninitialized]
  if (count<l){
  ^~
#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...