Pagini recente » Cod sursa (job #127127) | Cod sursa (job #2513453) | Cod sursa (job #1865282) | Cod sursa (job #2165733) | Cod sursa (job #1743015)
#include <fstream>
#include <vector>
#include <functional>
using namespace std;
constexpr int kMaxN = 34567;
constexpr long double INF = 1e50;
int main() {
ifstream cin("euro.in");
ofstream cout("euro.out");
cin.tie(0);
ios_base::sync_with_stdio(false);
int n, k; cin >> n >> k;
vector<int64_t> sp(n + 1); sp[0] = 0LL;
for (int i = 1; i <= n; i += 1) {
int x; cin >> x;
sp[i] = sp[i - 1] + x;
}
vector<int64_t> dp(n + 1);
vector<int> convex_hull(n + 1); // deque de linii
int dqHead = 0, dqTail = 0;
function<long double (const int&, const int&)> line_intersection = [&dp, &sp] (const int& x, const int& y) { // cand y il scoate pe x
const int64_t a = sp[x] - sp[y];
const long double b = dp[y] - dp[x];
if (a >= 0LL and b > 0) {
return -INF;
} else if (a <= 0LL and b < 0) {
return INF;
} else if (a > 0LL) {
return -b / a;
} else {
return INF;
}
};
for (int i = 1; i <= n; i += 1) {
while ((dqHead + 1) < dqTail and i > line_intersection(convex_hull[dqHead], convex_hull[dqHead + 1])) {
dqHead += 1;
}
dp[i] = (sp[i] - sp[convex_hull[dqHead]]) * i + dp[convex_hull[dqHead]] - k;
while (dqHead < dqTail - 1
and line_intersection(convex_hull[dqTail - 2], convex_hull[dqTail - 1]) >= line_intersection(convex_hull[dqTail - 1], i)) {
dqTail -= 1;
}
convex_hull[dqTail++] = i;
}
cout << dp[n] << '\n';
return 0;
}