This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <math.h>
#include "xylophone.h"
using namespace std;
const int maxn = 5005;
int p[maxn];
bool appeared[maxn];
void solve(int n)
{
for (int i = 1; i <= n; ++i)
{
appeared[i] = false;
}
int l = 1;
int r = n;
while (l <= r)
{
int mid = (l + r) >> 1;
if (query(1, mid) == n - 1) r = mid - 1;
else l = mid + 1;
}
int pos_n = l;
p[pos_n] = n;
appeared[n] = true;
p[pos_n - 1] = p[pos_n] - query(pos_n - 1, pos_n);
appeared[p[pos_n - 1]] = true;
if (pos_n != n)
{
p[pos_n + 1] = p[pos_n] - query(pos_n, pos_n + 1);
appeared[p[pos_n + 1]] = true;
}
for (int i = pos_n - 2; i >= 1; --i)
{
int x = query(i, i + 1);
if (p[i + 1] + x > n)
{
p[i] = p[i + 1] - x;
appeared[p[i]] = true;
continue;
}
if (p[i + 1] - x <= 0)
{
p[i] = p[i + 1] + x;
appeared[p[i]] = true;
continue;
}
if (appeared[p[i + 1] + x] == true)
{
p[i] = p[i + 1] - x;
appeared[p[i]] = true;
continue;
}
if (appeared[p[i + 1] - x] == true)
{
p[i] = p[i + 1] + x;
appeared[p[i]] = true;
continue;
}
int y = abs(p[i + 1] - p[i + 2]);
int z = query(i, i + 2);
if (z == x + y)
{
if (p[i + 2] > p[i + 1])
{
p[i] = p[i + 1] - x;
appeared[p[i]] = true;
}
else
{
p[i] = p[i + 1] + x;
appeared[p[i]] = true;
}
}
else
{
if (p[i + 1] > p[i + 2])
{
p[i] = p[i + 1] - x;
appeared[p[i]] = true;
}
else
{
p[i] = p[i + 1] + x;
appeared[p[i]] = true;
}
}
}
for (int i = pos_n + 2; i <= n; ++i)
{
int x = query(i - 1, i);
if (p[i - 1] + x > n)
{
p[i] = p[i - 1] - x;
appeared[p[i]] = true;
continue;
}
if (p[i - 1] - x <= 0)
{
p[i] = p[i - 1] + x;
appeared[p[i]] = true;
continue;
}
if (appeared[p[i - 1] + x] == true)
{
p[i] = p[i - 1] - x;
appeared[p[i]] = true;
continue;
}
if (appeared[p[i - 1] - x] == true)
{
p[i] = p[i - 1] + x;
appeared[p[i]] = true;
continue;
}
int y = abs(p[i - 1] - p[i - 2]);
int z = query(i - 2, i);
if (z == x + y)
{
if (p[i - 2] > p[i - 1])
{
p[i] = p[i - 1] - x;
appeared[p[i]] = true;
}
else
{
p[i] = p[i - 1] + x;
appeared[p[i]] = true;
}
}
else
{
if (p[i - 1] > p[i - 2])
{
p[i] = p[i - 1] - x;
appeared[p[i]] = true;
}
else
{
p[i] = p[i - 1] + x;
appeared[p[i]] = true;
}
}
}
for (int i = 1; i <= n; ++i)
{
answer(i, p[i]);
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |