제출 #1247801

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

#define ll long long
#define pi pair<int, int>
#define pl pair<ll, ll>
#define vi vector<int>
#define vl vector<ll>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(),(x).end()

bool check(int n, int s[], int r, int x[], int y[], int p[], int q[]) {
	for (int i=0; i<r; i++) {
		swap(s[x[i]],s[y[i]]);
		swap(s[p[i]],s[q[i]]);
	}
	bool ok=1;
	for (int i=0; i<n; i++) {
		ok&=(s[i]==i);
	}
	return ok;
}

bool sorted(int n, int s[]) {
	bool ok=1;
	for (int i=0; i<n && ok; i++) {
		ok&=(s[i]==i);
	}
	return ok;
}

int findSwapPairs(int n, int s[], int m, int x[], int y[], int p[], int q[]) {
	if (n==1) {
		return 0;
	}
	int ss[n];
	for (int i=0; i<n; i++) {
		ss[i]=s[i];
	}
	vector<vi> lst(n,{m});
	for (int i=m-1; i>=0; i--) {
		if (x[i]!=y[i]) {
			lst[x[i]].pb(i);
			lst[y[i]].pb(i);
		}
	}
	priority_queue<pi> qu;
	for (int i=0; i<n; i++) {
		if (s[i]==i) {
			continue;
		}
		qu.push({lst[i].back(),i});
	}
	int ind=0;
	while (!sorted(n,s)) {
		if (x[ind]!=y[ind]) {
			if (s[x[ind]]==x[ind]) {
				qu.push({lst[x[ind]].back(),x[ind]});
			}
			if (s[y[ind]]==y[ind]) {
				qu.push({lst[y[ind]].back(),y[ind]});
			}
		}
		swap(s[x[ind]],s[y[ind]]);
		auto [time,i]=qu.top();
		qu.pop();
		if (s[i]==i || time!=lst[i].back()) {
			swap(s[x[ind]],s[y[ind]]);
			continue;
		}
		p[ind]=i;
		q[ind]=find(s,s+n,i)-s;
		swap(s[p[ind]],s[q[ind]]);
		if (x[ind]!=y[ind]) {
			lst[x[ind]].pop_back();
			lst[y[ind]].pop_back();
			if (s[x[ind]]!=x[ind]) {
				qu.push({lst[x[ind]].back(),x[ind]});
			}
			if (s[y[ind]]!=y[ind]) {
				qu.push({lst[y[ind]].back(),y[ind]});
			}
		}		
		ind++;
	}
	assert(check(n,ss,ind,x,y,p,q));
	return ind;
}
#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...