제출 #1254693

#제출 시각아이디문제언어결과실행 시간메모리
1254693random_nameXylophone (JOI18_xylophone)C++20
100 / 100
21 ms724 KiB
#include "xylophone.h"
#include <bits/stdc++.h>

static int A[5000];

void solve(int N) {
    int l = 0, r = N-1;

    while(true) {
        int m = (l + r) / 2;
        // std::cout << l << ' ' << r << '\n';
        if(query(l+1, m+1) == N-1){
            r = m;
        }

        else if(query(m+2, r+1) == N-1){
            l = m+1;
        }

        else{
            break;
        }
    }

    int li = (l+r+1) / 2;
    int ri = r;


    // std::cout << "----\n";
    while(li != ri){
        // std::cout << li << ' ' << ri << '\n';
        int m = (li + ri) / 2;
        if(query(l+1, m+1) == N-1){
            ri = m;
        }

        else{
            li = m+1;
        }
    }

    int Max = li;

    std::set<int> used;
    std::vector<int> B(N);
    B[Max] = N;
    used.insert(N);

    int temp_max = Max;
    bool accending = false;
    for(int i = Max+1; i < N; i++){
        int diff = query(i, i+1);
        if(B[i-1] + diff > N || used.count(B[i-1] + diff)){
            B[i] = B[i-1] - diff;
            used.insert(B[i]);
            continue;
        }

        if(B[i-1] - diff < 1 || used.count(B[i-1] - diff)){
            used.insert(B[i]);
            B[i] = B[i-1] + diff;
            continue;
        }

        int diff2 = query(i-1, i+1);

        if(diff2 == abs(B[i-1] - B[i-2]) || diff2 == diff){
            if(B[i-1] > B[i-2]){
                B[i] = B[i-1] - diff;
            }

            else{
                B[i] = B[i-1] + diff;
            }
            used.insert(B[i]);
            continue;
        }

        if(B[i-1] > B[i-2]){
            B[i] = B[i-1] + diff;
        }

        else{
            B[i] = B[i-1] - diff;
        }

        used.insert(B[i]);

    }


    for(int i = Max-1; i >= 0; i--){
        int diff = query(i+1, i+2);
        if(B[i+1] + diff > N || used.count(B[i+1] + diff)){
            B[i] = B[i+1] - diff;
            used.insert(B[i]);

            continue;
        }

        if(B[i+1] - diff < 1 || used.count(B[i+1] - diff)){
            B[i] = B[i+1] + diff;
            used.insert(B[i]);

            continue;
        }

        int diff2 = query(i+1, i+3);

        if(diff2 == abs(B[i+1] - B[i+2]) || diff2 == diff){
            if(B[i+1] > B[i+2]){
                B[i] = B[i+1] - diff;
            }

            else{
                B[i] = B[i+1] + diff;
            }
            used.insert(B[i]);

            continue;
        }

        if(B[i+1] > B[i+2]){
            B[i] = B[i+1] + diff;
        }

        else{
            B[i] = B[i+1] - diff;
        }

        used.insert(B[i]);


    }

    for(int i = 0; i < N; i++){
        // std::cout << B[i] << ' ';
        answer(i+1, B[i]);
    }
    // std::cout << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...