#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define vi vector<long long>
#define all(x) x.begin(), x.end()
#define endl "\n"
void solution();
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
solution();
return 0;
}
struct SegTree {
vi a, tree;
ll n;
SegTree (const vi &temp) {
a = temp;
n = a.size();
tree.resize(4*n);
}
void build(int id, int l, int r) {
if (l == r) {
tree[id] = a[l];
return;
}
int mid = (l + r)/2;
build(2*id, l, mid);
build(2*id+1, mid+1, r);
tree[id] = min(tree[2*id], tree[2*id+1]);
}
ll query(int id, int l, int r, int L, int R) {
if (L > r || l > R) return 1e18;
if (L <= l && R >= r) return tree[id];
int mid = (l + r)/2;
return min(query(2*id, l, mid, L, R), query(2*id+1, mid+1, r, L, R));
}
void build(){build(1, 0, n-1);}
ll query(int l, int r) {
l = max(l, 0);
r = min(r, int(n-1));
return query(1, 0, n-1, l, r);
}
};
void solution() {
ll n, h;
cin >> n >> h;
vi a(n);
for (ll &z : a) cin >> z;
ll mx = *max_element(all(a));
h = min(h, mx);
vi dp(mx+1);
for (int i = 0; i < n; i++) {
vi ndp(mx+1);
SegTree m(dp);
m.build();
for (int j = 0; j <= mx; j++) {
ndp[j] = abs(j-a[i]) + m.query(j-h, j+h);
}
dp = move(ndp);
}
cout << *min_element(all(dp)) << endl;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |