Pagini recente » Cod sursa (job #3359678) | Cod sursa (job #3359681) | Cod sursa (job #3359676) | Monitorul de evaluare | Cod sursa (job #3359677)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("euro.in");
ofstream fout("euro.out");
const long long INF = 4e18;
struct Line {
long long a, b;
Line(long long a = 0, long long b = -INF) {
this->a = a;
this->b = b;
}
long long get(long long x) {
return a * x + b;
}
};
int n;
long long t;
long long pref[35005], dp[35005];
vector<Line> tree;
void addLine(int node, int l, int r, Line line) {
int mid = (l + r) / 2;
if (line.get(mid) > tree[node].get(mid))
swap(line, tree[node]);
if (l == r)
return;
if (line.get(l) > tree[node].get(l))
addLine(2 * node, l, mid, line);
else if (line.get(r) > tree[node].get(r))
addLine(2 * node + 1, mid + 1, r, line);
}
long long query(int node, int l, int r, int x) {
long long ans = tree[node].get(x);
if (l == r)
return ans;
int mid = (l + r) / 2;
if (x <= mid)
ans = max(ans, query(2 * node, l, mid, x));
else
ans = max(ans, query(2 * node + 1, mid + 1, r, x));
return ans;
}
int main() {
fin >> n >> t;
tree.resize(4 * n + 5);
addLine(1, 1, n, Line(0, 0));
for (int i = 1; i <= n; ++i) {
long long x;
fin >> x;
pref[i] = pref[i - 1] + x;
dp[i] = pref[i] * i - t + query(1, 1, n, i);
addLine(1, 1, n, Line(-pref[i], dp[i]));
}
fout << dp[n] << "\n";
return 0;
}