# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1253614 | arda | Xylophone (JOI18_xylophone) | C++20 | 0 ms | 0 KiB |
#include "xylophone.h"
static int A[5000];
int N, q_max = 10000, cnt = 0;
int q(int l, int r){
cnt++;
if(cnt > q_max){
return -1;
}
if(!(1 <= l && l <= r && r <= N){
return -1;
}
return query(l, r);
}
void solve(int n) {
N = n;
int l = 1, r = n;
while(l != r){
int m = (l + r) / 2;
if(m == 1){
break;
}
int res = q(1, m);
if(res == n-1) r = m;
else l = m+1;
}
int ans[n+1], ans2[n+1];
for(int i = 0; i <= n; i++) ans2[i] = -1;
ans[l] = 1;
ans2[1] = 1;
if(l != n) ans[l+1] = q(l, l+1) + 1, ans2[ans[l+1]] = 1;
// cout << l << " " << ans[l] << " " << ans[l+1]<<endl;
for(int i = l+2; i <= n; i++){
int hmmm = q(i-1,i);
if(ans[i-1] + hmmm > n){
ans[i] = ans[i-1] - hmmm;
ans2[ans[i-1]-hmmm] = 1;
continue;
}
if(ans[i-1] - hmmm < 2){
ans[i] = ans[i-1] + hmmm;
ans2[ans[i-1]+hmmm] = 1;
continue;
}
if(ans2[ans[i-1] + hmmm] != -1){
ans[i] = ans[i-1] - hmmm;
ans2[ans[i-1]-hmmm] = 1;
continue;
}
if(ans2[ans[i-1] - hmmm] != -1){
ans[i] = ans[i-1] + hmmm;
ans2[ans[i-1]+hmmm] = 1;
continue;
}
int of = q(i-2, i);
if(ans[i-2]<ans[i-1]){
if(of == (ans[i-1]-ans[i-2] + hmmm)) ans[i] = ans[i-1] + hmmm, ans2[ans[i-1] + hmmm] = 1;
else ans[i] = ans[i-1] - hmmm, ans2[ans[i-1] - hmmm] = 1;
}
else{
if(of == (ans[i-2]-ans[i-1] + hmmm)) ans[i] = ans[i-1] - hmmm, ans2[ans[i-1] - hmmm] = 1;
else ans[i] = ans[i-1] + hmmm, ans2[ans[i-1] + hmmm] = 1;
}
}
if(l != 1) ans[l-1] = q(l-1, l) + 1, ans2[ans[l-1]] = l-1;
for(int i = l-2; i > 0; i--){
int hmmm = q(i,i+1);
if(ans[i+1] + hmmm > n){
ans[i] = ans[i+1] - hmmm;
ans2[ans[i+1]-hmmm] = i;
continue;
}
if(ans[i+1] - hmmm < 2){
ans[i] = ans[i+1] + hmmm;
ans2[ans[i+1]+hmmm] = i;
continue;
}
if(ans2[ans[i+1] + hmmm] != -1){
ans[i] = ans[i+1] - hmmm;
ans2[ans[i+1]-hmmm] = i;
continue;
}
if(ans2[ans[i+1] - hmmm] != -1){
ans[i] = ans[i+1] + hmmm;
ans2[ans[i+1]+hmmm] = i;
continue;
}
int of = q(i, i+2);
if(ans[i+2]<ans[i+1]){
if(of == (ans[i+1]-ans[i+2] + hmmm)) ans[i] = ans[i+1] + hmmm, ans2[ans[i+1] + hmmm] = i;
else ans[i] = ans[i+1] - hmmm, ans2[ans[i+1] - hmmm] = i;
}
else{
if(of == (ans[i+2]-ans[i+1] + hmmm)) ans[i] = ans[i+1] - hmmm, ans2[ans[i+1] - hmmm] = i;
else ans[i] = ans[i+1] + hmmm, ans2[ans[i+1] + hmmm] = i;
}
}
for(int i = 1; i <= n; i++) answer(i, ans[i]);
}