Submission #677136

#TimeUsernameProblemLanguageResultExecution timeMemory
677136borisAngelovXylophone (JOI18_xylophone)C++17
0 / 100
0 ms296 KiB
#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)
    {
        cout << p[i] << " ";
    }

    cout << endl;

    for (int i = 1; i <= n; ++i)
    {
        answer(i, p[i]);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...