제출 #492417

#제출 시각아이디문제언어결과실행 시간메모리
492417alextodoranXylophone (JOI18_xylophone)C++17
100 / 100
105 ms580 KiB
/**
 ____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|

**/

#include <bits/stdc++.h>
#include "xylophone.h"

using namespace std;

typedef long long ll;

const int N_MAX = 5000;

int query (int s, int t);
void answer (int i, int a);

int A[N_MAX + 2];
int D[N_MAX + 2];
int E[N_MAX + 2];

bool build (int N) {
    for (int i = 3; i <= N; i++) {
        A[i] = A[i - 1] - D[i];
        if (max({A[i - 2], A[i - 1], A[i]}) - min({A[i - 2], A[i - 1], A[i]}) != E[i]) {
            A[i] = A[i - 1] + D[i];
        }
    }
    int mnPos = 1;
    int mxPos = 1;
    for (int i = 1; i <= N; i++) {
        if (A[i] < A[mnPos]) {
            mnPos = i;
        }
        if (A[i] > A[mxPos]) {
            mxPos = i;
        }
    }
    int mn = A[mnPos];
    for (int i = 1; i <= N; i++) {
        A[i] += 1 - mn;
    }
    return (mnPos < mxPos);
}

void solve (int N) {
    for (int i = 2; i <= N; i++) {
        D[i] = query(i - 1, i);
    }
    for (int i = 3; i <= N; i++) {
        E[i] = query(i - 2, i);
    }
    A[1] = 0;
    A[2] = 0 + D[2];
    if (build(N) == false) {
        A[1] = 0;
        A[2] = 0 - D[2];
        build(N);
    }

    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...