#include <iostream>
#include <algorithm>
#define REP(x,n) for (int x=0;x<(n);++x)
//#define MODE_DEBUG
#ifdef MODE_DEBUG
#define DEBUG(x) x
#else
#define DEBUG(x)
#endif
using namespace std;
const int MAX_N = 1000;
int segments[MAX_N];
int sorted[MAX_N];
int n,k;
long long process(int start) {
DEBUG(cerr << "Processing " << start << " / " << segments[start] << endl;)
long long result = 0;
for (int i=start; i > 0 && segments[i] > segments[i-1] + k; --i) {
DEBUG(cerr << " Adding " << segments[i] - k - segments[i-1] << " to " << i-1 << endl;)
result += segments[i] - k - segments[i-1];
segments[i-1] = segments[i] - k;
}
for (int i=start; i < n-1 && segments[i] > segments[i+1] + k; ++i) {
DEBUG(cerr << " Adding " << segments[i] - k - segments[i+1] << " to " << i+1 << endl;)
result += segments[i] - k - segments[i+1];
segments[i+1] = segments[i] - k;
}
return result;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
cin >> n >> k;
REP(x,n) {
cin>>segments[x];
sorted[x] = x;
}
sort(sorted, sorted+n, [](int a, int b) {return segments[a] > segments[b];});
DEBUG(
REP(x,n)
cerr << segments[sorted[x]] << " ";
cerr << endl;
)
long long result = 0;
REP(x,n) {
result += process(sorted[x]);
}
DEBUG(
cerr << "Final path" << endl;
REP(x,n)
cerr << segments[x] << " ";
)
cout << result;
return 0;
}
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 | #include <iostream> #include <algorithm> #define REP(x,n) for (int x=0;x<(n);++x) //#define MODE_DEBUG #ifdef MODE_DEBUG #define DEBUG(x) x #else #define DEBUG(x) #endif using namespace std; const int MAX_N = 1000; int segments[MAX_N]; int sorted[MAX_N]; int n,k; long long process(int start) { DEBUG(cerr << "Processing " << start << " / " << segments[start] << endl;) long long result = 0; for (int i=start; i > 0 && segments[i] > segments[i-1] + k; --i) { DEBUG(cerr << " Adding " << segments[i] - k - segments[i-1] << " to " << i-1 << endl;) result += segments[i] - k - segments[i-1]; segments[i-1] = segments[i] - k; } for (int i=start; i < n-1 && segments[i] > segments[i+1] + k; ++i) { DEBUG(cerr << " Adding " << segments[i] - k - segments[i+1] << " to " << i+1 << endl;) result += segments[i] - k - segments[i+1]; segments[i+1] = segments[i] - k; } return result; } int main() { ios_base::sync_with_stdio(0); cin.tie(nullptr); cin >> n >> k; REP(x,n) { cin>>segments[x]; sorted[x] = x; } sort(sorted, sorted+n, [](int a, int b) {return segments[a] > segments[b];}); DEBUG( REP(x,n) cerr << segments[sorted[x]] << " "; cerr << endl; ) long long result = 0; REP(x,n) { result += process(sorted[x]); } DEBUG( cerr << "Final path" << endl; REP(x,n) cerr << segments[x] << " "; ) cout << result; return 0; } |
English