Cod sursa(job #1654502)

Utilizator krityxAdrian Buzea krityx Data 17 martie 2016 10:05:32
Problema Farfurii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3 kb
#include <fstream>
#include <queue>
#define NMAX 100001
typedef long long ll;
using namespace std;

vector<int> solve(ll N, ll K)
{
	long long V[NMAX], i, sum, max, pIndex, element;
	vector<int> sol;
	sol.resize(N + 1);

	i = 1;
	sum = 0;
	V[N] = 0;

	while (sum + i <= K)
	{
		sum += V[N - i] = i;
		i++;
	}
	max = i;
	pIndex = N - i;
	element = N;
	if (pIndex < 0)
	{
		pIndex++;
	}
	bool once = true;
	for (i = pIndex + 1; i <= N; i++)
	{
		if (V[i - 1] == K - sum)
		{
			sol[i] = element - 1;
			sol[pIndex] = element;
			element -= 2;
		}
		else
		{
			sol[i] = element--;
		}
	}

	element = 1;

	long long startIndex = 1, endIndex = N;

	for (i = startIndex; i <= N; i++)
	{
		if (sol[i] == 0)
		{
			sol[i] = element++;
		}
	}
	return sol;
}

vector<int> solve1(int N, ll K)
{
	vector<int> result;
	result.push_back(0);
	//result.resize(N + 1);
	ll n = floor(sqrt(2 * K));
	if (n*n + n <= 2 * K)
		++n;

	ll rest = K - (n*n - n) / 2;
	for (int i = 1; i <= N - n - 1; ++i)
		result.push_back(i);

	result.push_back(N - n + rest);
	//fout << N - n + rest << " ";

	for (int i = N; i >= N - n; --i) {
		if (i == N - n + rest)
			continue;
		result.push_back(i);
		//fout << i << " ";
	}
	//fout << endl;
	return result;
}

//long long sol[NMAX];
//
//bool check(int n, int k)
//{
//	int i, j, nr = 0;
//	for (i = 1; i <= n; i++)
//	{
//		for (j = i + 1; j <= n; j++)
//		{
//			if (sol[i] > sol[j])
//			{
//				nr++;
//			}
//		}
//	}
//
//	if (nr != k)
//	{
//		return false;
//	}
//	return true;
//}

bool compare(vector<int> a, vector<int> b, int n)
{
	for (int i = 1; i <= n; i++)
	{
		if (a[i] != b[i])
		{
			return false;
		}
	}
	return true;
}

int main()
{
	for (int i = 0; i <= 91; i++)
	{
		vector<int> r1 = solve(14, i);
		vector<int> r2 = solve1(14, i);

		if (!compare(r1, r2, 14))
		{
			int a = i;
		}
	}
	//long long N, K, V[NMAX], i, sum, max, pIndex, element;

	//ifstream f("farfurii.in");
	//f >> N >> K;
	//f.close();

	//i = 1;
	//sum = 0;
	//V[N] = 0;

	//while (sum + i <= K)
	//{
	//	sum += V[N - i] = i;
	//	i++;
	//}
	//max = i;
	//pIndex = N - i;
	//element = N;
	//if (pIndex < 0)
	//{
	//	pIndex++;
	//}
	//bool once = true;
	//for (i = pIndex + 1; i <= N; i++)
	//{
	//	if (V[i - 1] == K - sum)
	//	{
	//		sol[i] = element - 1;
	//		sol[pIndex] = element;
	//		element -= 2;
	//	}
	//	else
	//	{
	//		sol[i] = element--;
	//	}
	//}

	//element = 1;

	//ofstream g("farfurii.out");
	//long long startIndex = 1, endIndex = N;

	//for (i = startIndex; i <= N; i++)
	//{
	//	if (sol[i] == 0)
	//	{
	//		sol[i] = element++;
	//		//g << element++ << " ";
	//	}
	//	//else
	//	//{
	//	//	g << sol[i] << " ";
	//	//}
	//}
	//if (!check(N, K))
	//{
	//	vector<int> test;
	//	test.resize(N);
	//	while (true)
	//	{

	//	}
	//}
	//else
	//{
	//	for (i = 1; i <= N; i++)
	//	{
	//		g << sol[i] << " ";
	//	}
	//}
	//g.close();

	return 0;
}