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
86
87
88
89
90
91
92
93
94
95
| // 더 많은 정보는 42jerrykim.github.io 에서 확인하세요.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
long long m;
if (!(cin >> n >> m)) return 0;
if (n == 0) {
cout << 0 << '\n';
return 0;
}
vector<pair<long long, bool>> pts;
pts.reserve(n + 1);
pts.push_back({0LL, false});
for (int i = 0; i < n; ++i) {
long long x; cin >> x;
pts.push_back({x, true});
}
sort(pts.begin(), pts.end());
int zero = -1;
for (int i = 0; i < (int)pts.size(); ++i) {
if (!pts[i].second) { zero = i; break; }
}
vector<long long> pos(pts.size());
for (int i = 0; i < (int)pts.size(); ++i) pos[i] = pts[i].first;
const long long INF = (1LL << 62);
long long best = 0;
int N = (int)pts.size(); // n + 1
for (int K = 1; K <= n; ++K) {
vector<vector<long long>> L(N, vector<long long>(N, INF));
vector<vector<long long>> R(N, vector<long long>(N, INF));
L[zero][zero] = 0;
R[zero][zero] = 0;
for (int len = 0; len < K; ++len) {
long long w = K - len;
int minL = max(0, zero - len);
int maxL = min(zero, N - 1 - len);
for (int l = minL; l <= maxL; ++l) {
int r = l + len;
long long a = L[l][r];
long long b = R[l][r];
if (a < INF) {
if (l > 0) {
long long d = pos[l] - pos[l - 1];
L[l - 1][r] = min(L[l - 1][r], a + w * d);
}
if (r + 1 < N) {
long long d = pos[r + 1] - pos[l];
R[l][r + 1] = min(R[l][r + 1], a + w * d);
}
}
if (b < INF) {
if (l > 0) {
long long d = pos[r] - pos[l - 1];
L[l - 1][r] = min(L[l - 1][r], b + w * d);
}
if (r + 1 < N) {
long long d = pos[r + 1] - pos[r];
R[l][r + 1] = min(R[l][r + 1], b + w * d);
}
}
}
}
long long bestSum = INF;
int minL = max(0, zero - K);
int maxL = min(zero, N - 1 - K);
for (int l = minL; l <= maxL; ++l) {
int r = l + K;
bestSum = min(bestSum, L[l][r]);
bestSum = min(bestSum, R[l][r]);
}
if (bestSum < INF) {
long long gain = 1LL * K * m - bestSum;
best = max(best, gain);
}
}
cout << max(0LL, best) << '\n';
return 0;
}
|