#include <bits/stdc++.h>
#include <queue>
using pii = std::pair<int, int>;
int main() {
int n, k;
std::cin >> n >> k;
std::vector<int> tab(n);
std::priority_queue<pii, std::vector<pii>, std::greater<pii>> q;
long long answer = 0;
auto maxneigh = [&](int i) -> int {
return std::max(
std::max(
tab[std::clamp(i - 1, 0, n - 1)],
tab[std::clamp(i + 1, 0, n - 1)]
),
tab[i]
);
};
for (int i = 0; i < n; i++) {
std::cin >> tab[i];
q.push({maxneigh(i), i});
}
while (!q.empty()) {
auto e = q.top();
q.pop();
int i = e.second;
int li = std::clamp(i - 1, 0, n - 1);
int ri = std::clamp(i + 1, 0, n - 1);
int new_val = std::max(
maxneigh(i) - k,
tab[i]
);
answer += new_val - tab[i];
if (new_val > tab[i]) {
if (li != i) {
q.push({maxneigh(li), li});
}
if (ri != i) {
q.push({maxneigh(ri), ri});
}
}
tab[i] = new_val;
}
std::cout << answer << "\n";
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <bits/stdc++.h> #include <queue> using pii = std::pair<int, int>; int main() { int n, k; std::cin >> n >> k; std::vector<int> tab(n); std::priority_queue<pii, std::vector<pii>, std::greater<pii>> q; long long answer = 0; auto maxneigh = [&](int i) -> int { return std::max( std::max( tab[std::clamp(i - 1, 0, n - 1)], tab[std::clamp(i + 1, 0, n - 1)] ), tab[i] ); }; for (int i = 0; i < n; i++) { std::cin >> tab[i]; q.push({maxneigh(i), i}); } while (!q.empty()) { auto e = q.top(); q.pop(); int i = e.second; int li = std::clamp(i - 1, 0, n - 1); int ri = std::clamp(i + 1, 0, n - 1); int new_val = std::max( maxneigh(i) - k, tab[i] ); answer += new_val - tab[i]; if (new_val > tab[i]) { if (li != i) { q.push({maxneigh(li), li}); } if (ri != i) { q.push({maxneigh(ri), ri}); } } tab[i] = new_val; } std::cout << answer << "\n"; } |
English