Pagini recente » Cod sursa (job #1379450) | Cod sursa (job #1654502)
#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;
}