# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
152722 | junodeveloper | Xylophone (JOI18_xylophone) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "xylophone.h"
static int A[5010];
static bool used[5010];
inline void Set(int i, int x) {
A[i]=x;
used[x]=1;
}
inline bool Poss(int x) {
return 1<=x&&x<=N&&!used[x];
}
void solve(int N) {
int lo=1, hi=n, x, y;
while(lo<hi) {
int mid=(lo+hi+1)/2;
x=query(mid,N);
if(x==N-1) lo=mid;
else hi=mid-1;
}
Set(lo,1);
int i;
if(lo+1<=n) {
x=query(lo,lo+1);
Set(lo+1,x+1);
}
if(lo-1>=1) {
x=query(lo-1,lo);
Set(lo-1,x+1);
}
for(i=lo+2;i<=N;i++) {
x=query(i-1,i);
if(!Poss(A[i-1]+x)) {
Set(i,A[i-1]-x);
} else if(!Poss(A[i-1]-x)) {
Set(i,A[i-1]+x);
} else {
if(A[i-2]>A[i-1]) {
y=query(i-2,i);
if(y==A[i-2]-A[i-1]+x) {
Set(i,A[i-1]-x);
} else {
Set(i,A[i-1]+x);
}
}
}
}
for(i=lo-2;i>=1;i--) {
x=query(i,i+1);
if(!Poss(A[i+1]+x)) {
Set(i,A[i+1]-x);
} else if(!Poss(A[i+1]-x)) {
Set(i,A[i+1]+x);
} else {
if(A[i+2]>A[i+1]) {
y=query(i,i+2);
if(y==A[i+2]-A[i+1]+x) {
Set(i,A[i+1]-x);
} else {
Set(i,A[i+1]+x);
}
}
}
}
for(i=1;i<=N;i++) answer(i,i);
}