# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
478982 | ponytail | Xylophone (JOI18_xylophone) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//SUBMIT
#include <bits/stdc++.h>
#include "xylophone.h"
using namespace std;
static int A[N_MAX];
void solve(int N) {
int value = query(1, N);
int P[N+1];
int delta[N+1];
int one[N+1], two[N+1];
for(int i = 1; i < N; i++) {
one[i] = query(i, i+1);
}
for(int i=1; i<N-1; i++) {
two[i] = query(i, i+2);
}
if(one[1] + one[2] == two[1]) delta[1] = one[1], delta[2] = one[2];
else delta[1] = one[1], delta[2] = -one[2];
for(int i=3; i<N; i++) {
if(one[i-1] + one[i] == two[i-1]) delta[i] = (delta[i-1] > 0 ? 1 : -1) * one[i];
else delta[i] = (delta[i-1] > 0 ? -1 : 1) * one[i];
}
int mini, maxi, cur;
mini = 1e9, maxi = -1e9, cur = 0;
for(int i=1; i<N; i++) {
cur += delta[i];
mini = min(mini, cur);
maxi = max(maxi, cur);
}
cur = 0;
int pos[N+1];
for(int i=2; i<=N; i++) {
cur += delta[i-1];
P[i] = cur - mini + 1;
pos[P[i]] = i;
}
P[1] = -mini + 1;
if(pos[1] > pos[N]) {
for(int i=1; i<N; i++) delta[i] *= -1;
mini = 1e9, maxi = -1e9, cur = 0;
for(int i=1; i<N; i++) {
cur += delta[i];
mini = min(mini, cur);
maxi = max(maxi, cur);
}
cur = 0;
for(int i=2; i<=N; i++) {
cur += delta[i-1];
P[i] = cur - mini + 1;
}
P[1] = -mini + 1;
}
for(int i=1; i<=N; i++) {
answer(i, P[i]);
}
}
//END SUBMIT