제출 #292347

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

const int maxn = 2e5 + 3; 

int n; 
int t[maxn];
int pos[maxn];
bool used[maxn];

int get_cycles()
{
	for (int i = 0; i < n; i++)
	used[i] = false; 
	
	int ans = 0; 
	for (int i = 0; i < n; i++)
	if (!used[i])
	{
		ans++;
		int j = i;
		while (!used[j])
		{
			used[j] = true;
			j = t[j];
		}
	}
	
	return ans; 
}

int findSwapPairs(int _n, int s[], int m, int x[], int y[], int p[], int q[])
{
	n = _n; 
	for (int i = 0; i < n; i++)
	pos[s[i]] = i;
	
	for (int i = 0; i < n; i++)
	t[i] = s[i];
	
	if (get_cycles() == n)
	return 0; 
	
	int low = 0, high = m-1;
	while (low < high)
	{
		int mid = (low + high) / 2; 
		for (int i = 0; i < n; i++)
		t[i] = s[i];
		
		for (int i = 0; i <= mid; i++)
		swap(t[x[i]], t[y[i]]);
		
		if (n - get_cycles() <= mid + 1)
		high = mid;
		
		else 
		low = mid + 1; 
	}
	
	for (int i = 0; i < n; i++)
		t[i] = s[i];
	
	for (int i = 0; i < m; i++)
	{
		swap(t[x[i]], t[y[i]]);
		
		if (i == low)
		{
			vector <pair <int, int> > v; 
			for (int j = 0; j < n; j++)
			used[j] = false; 
			
			for (int j = 0; j < n; j++)
			if (!used[j])
			{
				int curr = j;
				int last = j; 
				while (!used[curr])
				{
					used[curr] = true;
					if (curr != last)
					v.push_back({last, curr});
					
					last = curr;
					curr = t[curr];
				}
			}
			
			for (int j = 0; j <= i; j++)
			{
				if (x[j] != y[j])
				{
					swap(pos[s[x[j]]], pos[s[y[j]]]);
					swap(s[x[j]], s[y[j]]);
				}
				
				if (j < (int)v.size())
				{
					p[j] = pos[v[j].first];
					q[j] = pos[v[j].second];
					swap(pos[s[p[j]]], pos[s[q[j]]]);
					swap(s[p[j]], s[q[j]]);
				}
				
				else 
				p[j] = q[j] = 0; 
			}
			
			return i + 1; 
		}
	}
}

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

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:114:1: warning: control reaches end of non-void function [-Wreturn-type]
  114 | }
      | ^
#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...