#include "peru.h"
#include "bits/stdc++.h"
namespace {
#ifdef DEBUG
#include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
#define debug(...) void(23)
#endif
using i64 = long long;
constexpr i64 inf = i64(1E18);
constexpr int md = int(1E9) + 7;
#define def int mid = (l + r) >> 1, lv = v + 1, rv = v + ((mid - l + 1) << 1)
struct segtree {
int n;
std::vector<i64> tree;
segtree(int n_) : n(n_), tree(n << 1, inf) {}
void set(int v, int l, int r, int p, i64 x) {
if (l == r) {
tree[v] = x;
return;
}
def;
if (p <= mid) {
set(lv, l, mid, p, x);
} else {
set(rv, mid + 1, r, p, x);
}
tree[v] = std::min(tree[lv], tree[rv]);
}
void set(int p, i64 x) {
set(0, 0, n - 1, p, x);
}
i64 get(int v, int l, int r, int ql, int qr) {
if (ql == l && r == qr) {
return tree[v];
}
def;
if (qr <= mid) {
return get(lv, l, mid, ql, qr);
} else if (mid + 1 <= ql) {
return get(rv, mid + 1, r, ql, qr);
} else {
return std::min(get(lv, l, mid, ql, mid), get(rv, mid + 1, r, mid + 1, qr));
}
}
i64 get(int l, int r) {
return get(0, 0, n - 1, l, r);
}
};
};
int solve(int N, int K, int* A) {
std::vector<i64> f(N + 1, inf);
std::deque<int> deq;
segtree seg(N + 1);
f[0] = 0;
for (int i = 1; i <= N; ++i) {
if (!deq.empty() && deq.front() == i - K - 1) {
seg.set(deq.front(), inf);
deq.pop_front();
}
while (!deq.empty() && A[deq.back() - 1] <= A[i - 1]) {
seg.set(deq.back(), inf);
deq.pop_back();
}
if (!deq.empty()) {
seg.set(deq.back(), f[deq.back()] + A[i - 1]);
}
deq.emplace_back(i);
debug(i, deq);
f[i] = seg.get(std::max(0, i - K), i - 1);
f[i] = std::min(f[i], f[std::max(0, i - K)] + A[deq.front() - 1]);
seg.set(i, f[i]);
#ifdef LOCAL
int mx = 0;
i64 real = inf;
for (int j = i; j >= std::max(1, i - K + 1); --j) {
mx = std::max(mx, A[j - 1]);
real = std::min(real, f[j - 1] + mx);
}
mx = 0;
for (int j = i; j >= std::max(1, i - K + 1); --j) {
mx = std::max(mx, A[j - 1]);
real = std::min(real, f[j - 1] + mx);
if (real == f[j - 1] + mx) {
debug(i, j - 1);
}
}
debug(real, f[i]);
assert(real == f[i]);
#endif
}
int ans = 0;
for (int i = 0; i < N; ++i) {
int x = f[i + 1] % md;
debug(i, x);
ans = (ans * 23LL + x) % md;
}
return ans;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |