QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#409133 | #8282. Mirrors | .5 ulp (Maxim Plyushkin, Egor Belousov, Maxim Inyutin)# | WA | 36ms | 519424kb | C++20 | 2.6kb | 2024-05-11 19:29:19 | 2024-05-11 19:29:19 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pl = pair<ll, ll>;
constexpr ll mod = 998244353;
constexpr ll INF = 1e15 + 7;
constexpr ll LOG = 22;
constexpr ll N = 5e5 + 50;
ll nxt[2][N][LOG];
pl val[2][N][LOG];
int main() {
cin.tie(0)->sync_with_stdio(false);
for (ll i = 0; i < 2; ++i) {
for (ll j = 0; j < N; ++j) {
for (ll k = 0; k < LOG; ++k) {
nxt[i][j][k] = -1;
val[i][j][k] = {-INF, INF};
}
}
}
auto check = [](pl x) {
return x.first < x.second;
};
auto chmin = [](auto &x, auto y) {
x = min(x, y);
};
auto chmax = [](auto &x, auto y) {
x = max(x, y);
};
ll n;
cin >> n;
vector<ll> a(n);
for (auto &i: a)cin >> i;
ll inc = -1, dec = -1;
ll res = 0;
for (ll i = 0; i < n; ++i) {
if (i && a[i] <= a[i - 1]) {
inc = i - 1;
}
if (i && a[i] >= a[i - 1]) {
dec = i - 1;
}
nxt[0][i][0] = inc;
chmin(val[0][i][0].second, ~inc ? a[inc] + a[inc + 1] : INF);
nxt[1][i][0] = dec;
chmax(val[1][i][0].first, ~dec ? a[dec] + a[dec + 1] : -INF);
for (ll j = 1; j < LOG; ++j) {
for (ll id = 0; id < 2; ++id) {
auto it = nxt[id][i][j - 1];
auto v = val[id][i][j - 1];
if (~it) {
nxt[id][i][j] = nxt[j == 1 ? 1 ^ id : id][it][j - 1];
val[id][i][j] = v;
chmax(val[id][i][j].first, val[j == 1 ? id ^ 1 : id][it][j - 1].first);
chmin(val[id][i][j].second, val[j == 1 ? id ^ 1 : id][it][j - 1].second);
} else {
nxt[id][i][j] = it;
val[id][i][j] = v;
}
}
}
ll best = i;
for (ll id = 0; id < 2; ++id) {
ll cur = i;
pl now = {-INF, INF};
ll z = id;
for (ll j = LOG - 1; ~j && ~cur; --j) {
auto nw = pl{max(now.first, val[id][cur][j].first), min(now.second, val[id][cur][j].second)};
if (check(nw)) {
now = nw;
cur = nxt[id][cur][j];
z ^= (j == 0);
}
}
if (~cur) {
cur = nxt[z][cur][0];
}
best = min(best, cur);
}
res += i - best - 1;
// cout << best << "\n";
}
cout << res;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 19ms
memory: 519424kb
input:
2 2 1
output:
1
result:
ok 1 number(s): "1"
Test #2:
score: -100
Wrong Answer
time: 36ms
memory: 519168kb
input:
10 2 2 2 2 1 4 5 3 3 2
output:
18
result:
wrong answer 1st numbers differ - expected: '20', found: '18'