| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1320258 | ppmn_6 | Xylophone (JOI18_xylophone) | C++20 | 0 ms | 0 KiB |
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
// https://codeforces.com/blog/entry/79148
class Timer: chrono::high_resolution_clock {
const time_point start_time;
public:
Timer(): start_time(now()) {}
rep elapsed_time() const {
return chrono::duration_cast<chrono::milliseconds>(now() - start_time).count();
}
} timer;
void solve(int n) {
vector<int> d1(n + 1), d2(n + 1), pf(n + 1);
vector<bool> dir(n + 1);
dir[1] = 1;
for (int i = 1; i < n; i++) {
d1[i] = query(i, i + 1);
}
for (int i = 1; i < n - 1; i++) {
d2[i] = query(i, i + 2);
}
for (int i = 2; i < n; i++) {
dir[i] = dir[i - 1] ^ (d2[i - 1] != d1[i - 1] + d1[i]);
}
pf[1] = 0;
int pos_ma = 1, pos_mi = 1;
for (int i = 2; i <= n; i++) {
pf[i] = pf[i - 1] + (dir[i - 1] ? 1 : -1) * d1[i - 1];
if (pf[i] < pf[pos_mi]) {
pos_mi = i;
}
if (pf[i] > pf[pos_ma]) {
pos_ma = i;
}
}
if (pos_ma < pos_mi) {
for (int i = 1; i < n; i++) {
dir[i] = !dir[i];
}
pos_ma = pos_mi = 1;
for (int i = 2; i <= n; i++) {
pf[i] = pf[i - 1] + (dir[i - 1] ? 1 : -1) * d1[i - 1];
if (pf[i] < pf[pos_mi]) {
pos_mi = i;
}
if (pf[i] > pf[pos_ma]) {
pos_ma = i;
}
}
}
for (int i = 1; i <= n; i++) {
answer(i, pf[i] - pf[pos_mi] + 1);
}
}
