#include <iostream>
#include <vector>
typedef std::vector<int32_t> vect;
void print(vect &v) {
for (int32_t i = 0; i < v.size(); ++i) {
std::cerr << v[i] << " ";
}
std::cerr << "\n";
}
int32_t alignRight(int32_t idx, int32_t k, vect &v);
int32_t alignLeft(int32_t idx, int32_t k, vect &v) {
int32_t result = 0;
for (int32_t i = idx; i >= 0; --i) {
if (i > 0) {
int32_t numCont = 0;
int32_t diff = v[i] - v[i - 1];
if (diff > k) {
numCont = diff - k;
v[i - 1] += numCont;
} else if (diff < (-k)) {
numCont = ((-1) * diff) - k;
v[i] += numCont;
numCont += alignRight(i, k, v);
}
result += numCont;
// print(v);
}
}
return result;
}
int32_t alignRight(int32_t idx, int32_t k, vect &v) {
int32_t result = 0;
for (int32_t i = idx; i < v.size(); ++i) {
if (i < v.size() - 1) {
int32_t numCont = 0;
int32_t diff = v[i] - v[i + 1];
if (diff > k) {
numCont = diff - k;
v[i +1] += numCont;
} else if (diff < (-k)) {
numCont = ((-1) * diff) - k;
v[i] += numCont;
numCont += alignLeft(i, k, v);
}
result += numCont;
// print(v);
}
}
return result;
}
void prog_main(std::istream& in, std::ostream& out)
{
int32_t n = 0;
int32_t k = 0;
in >> n;
in >> k;
vect v(n, 0);
int32_t maxId = 0;
for (int32_t i = 0; i < v.size(); ++i) {
in >> v[i];
if (v[maxId] < v[i]) {
maxId = i;
}
}
// print(v);
int32_t result = alignLeft(maxId, k, v);
result += alignRight(maxId, k, v);
out << result;
}
#ifndef TEST
int main(int argc, char* argv[])
{
prog_main(std::cin, std::cout);
return 0;
}
#endif
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <iostream> #include <vector> typedef std::vector<int32_t> vect; void print(vect &v) { for (int32_t i = 0; i < v.size(); ++i) { std::cerr << v[i] << " "; } std::cerr << "\n"; } int32_t alignRight(int32_t idx, int32_t k, vect &v); int32_t alignLeft(int32_t idx, int32_t k, vect &v) { int32_t result = 0; for (int32_t i = idx; i >= 0; --i) { if (i > 0) { int32_t numCont = 0; int32_t diff = v[i] - v[i - 1]; if (diff > k) { numCont = diff - k; v[i - 1] += numCont; } else if (diff < (-k)) { numCont = ((-1) * diff) - k; v[i] += numCont; numCont += alignRight(i, k, v); } result += numCont; // print(v); } } return result; } int32_t alignRight(int32_t idx, int32_t k, vect &v) { int32_t result = 0; for (int32_t i = idx; i < v.size(); ++i) { if (i < v.size() - 1) { int32_t numCont = 0; int32_t diff = v[i] - v[i + 1]; if (diff > k) { numCont = diff - k; v[i +1] += numCont; } else if (diff < (-k)) { numCont = ((-1) * diff) - k; v[i] += numCont; numCont += alignLeft(i, k, v); } result += numCont; // print(v); } } return result; } void prog_main(std::istream& in, std::ostream& out) { int32_t n = 0; int32_t k = 0; in >> n; in >> k; vect v(n, 0); int32_t maxId = 0; for (int32_t i = 0; i < v.size(); ++i) { in >> v[i]; if (v[maxId] < v[i]) { maxId = i; } } // print(v); int32_t result = alignLeft(maxId, k, v); result += alignRight(maxId, k, v); out << result; } #ifndef TEST int main(int argc, char* argv[]) { prog_main(std::cin, std::cout); return 0; } #endif |
English