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;
}