Submission #156358

#TimeUsernameProblemLanguageResultExecution timeMemory
156358georgerapeanuXylophone (JOI18_xylophone)C++11
100 / 100
87 ms504 KiB
#include "xylophone.h"
#include <cstdio>

using namespace std;

static int a[5005];
bool taken[5005];

void solve(int n) {

    int l = 1,r = n;

    while(r - l > 1){
        int mid = (l + r) / 2;
        if(query(1,mid) == n - 1){
            r = mid;
        }
        else{
            l = mid;
        }
    }

    int pos_n = r;
    a[pos_n] = n;
    taken[n] = true;

    for(int i = pos_n + 1;i <= n;i++){
        int delta = query(i - 1,i);
        if(a[i - 1] + delta > n || taken[a[i - 1] + delta]){
            a[i] = a[i - 1] - delta;
        }
        else if(a[i - 1] - delta < 1 || taken[a[i - 1] - delta]){
            a[i] = a[i - 1] + delta;
        }
        else{
            int delta2 = query(i - 2,i);
            if(delta2 == delta){
                a[i] = (a[i - 1] <= a[i - 2] ? delta:-delta) + a[i - 1];
            }
            else{
                if(a[i - 1] + delta == a[i - 2] + delta2 || a[i - 1] + delta == a[i - 2] - delta2){
                    a[i] = a[i - 1] + delta;
                }
                else if(a[i - 1] - delta == a[i - 2] + delta2 || a[i - 1] - delta == a[i - 2] -delta2){
                    a[i] = a[i - 1] - delta;
                }
                else{
                    a[i] = a[i - 1] + (a[i - 1] < a[i - 2] ? delta:-delta);
                }
            }
        }
        taken[a[i]] = true;
    }
    
    for(int i = pos_n - 1;i;i--){
        int delta = query(i,i + 1);
        if(a[i + 1] + delta > n || taken[a[i + 1] + delta]){
            a[i] = a[i + 1] - delta;
        }
        else if(a[i + 1] - delta < 1 || taken[a[i + 1] - delta]){
            a[i] = a[i + 1] + delta;
        }
        else{
            int delta2 = query(i,i + 2);
            if(delta2 == delta){
                a[i] = (a[i + 1] <= a[i + 2] ? delta:-delta) + a[i + 1];
            }
            else{
                if(a[i + 1] + delta == a[i + 2] + delta2 || a[i + 1] + delta == a[i + 2] - delta2){
                    a[i] = a[i + 1] + delta;
                }
                else if(a[i + 1] - delta == a[i + 2] + delta2 || a[i + 1] - delta == a[i + 2] -delta2){
                    a[i] = a[i + 1] - delta;
                }
                else{
                    a[i] = a[i + 1] + (a[i + 1] < a[i + 2] ? delta:-delta);
                }
            }
        }
        taken[a[i]] = true;
    }

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