| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1316988 | pobe | Xylophone (JOI18_xylophone) | C++20 | 0 ms | 0 KiB |
#include "xylophone.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define int long long
using namespace std;
using namespace __gnu_pbds;
using ordered_set = tree <int, null_type, less_equal <int>, rb_tree_tag, tree_order_statistics_node_update>;
ostream &operator <<(ostream &out, vector <int> val) {
for (auto v : val) {
out << v << ' ';
}
return out;
}
void solve(int n) {
vector <int> res(n);
if (n == 1) {
ans(1, 1);
return;
} else if (n == 2) {
ans(1, 1);
ans(2, 2);
return;
}
vector <int> d(n - 1);
for (int i = 0; i < n - 1; ++i) {
d[i] = query(i + 1, i + 2);
}
res[0] = 0;
res[1] = d[0];
for (int i = 0; i < n - 2; ++i) {
int v = query(i + 1, i + 3);
if (v == d[i] + d[i + 1]) {
if (res[i] < res[i + 1]) {
res[i + 2] = res[i + 1] + d[i + 1];
} else {
res[i + 2] = res[i + 1] - d[i + 1];
}
} else {
if (res[i] < res[i + 1]) {
res[i + 2] = res[i + 1] - d[i + 1];
} else {
res[i + 2] = res[i + 1] + d[i + 1];
}
}
}
int ind1 = min_element(res.begin(), res.end()) - res.begin();
int ind2 = max_element(res.begin(), res.end()) - res.begin();
int v = res[ind1];
for (int i = 0; i < n; ++i) {
res[i] = res[i] - v + 1;
if (ind2 < ind1) {
res[i] = n + 1 - res[i];
}
ans(i + 1, res[i]);
}
}
