Pagini recente » Diferente pentru jc2021/solutii/rollercoaster intre reviziile 1 si 2 | Cod sursa (job #3348438) | Cod sursa (job #3315516) | Cod sursa (job #3307647) | Cod sursa (job #3344575)
#include <bits/stdc++.h>
using namespace std;
struct Line {
int64_t m, b;
int64_t eval(int64_t x) { return m * x + b; }
};
const int MAXN = 34568;
Line tree[4 * MAXN];
bool has[4 * MAXN];
void insert(int node, int lo, int hi, Line nl) {
if (lo == hi) {
if (!has[node] || nl.eval(lo) > tree[node].eval(lo)) {
tree[node] = nl;
has[node] = true;
}
return;
}
int mid = (lo + hi) / 2;
if (!has[node]) {
tree[node] = nl;
has[node] = true;
return;
}
bool leftBetter = nl.eval(lo) > tree[node].eval(lo);
bool midBetter = nl.eval(mid) > tree[node].eval(mid);
if (midBetter)
swap(tree[node], nl);
if (leftBetter != midBetter)
insert(2 * node, lo, mid, nl);
else
insert(2 * node + 1, mid + 1, hi, nl);
}
int64_t query(int node, int lo, int hi, int x) {
int64_t res = has[node] ? tree[node].eval(x) : LLONG_MIN;
if (lo == hi) {
return res;
}
int mid = (lo + hi) / 2;
if (x <= mid)
return max(res, query(2 * node, lo, mid, x));
else
return max(res, query(2 * node + 1, mid + 1, hi, x));
}
int main() {
freopen("euro.in", "r", stdin);
freopen("euro.out", "w", stdout);
int n, t;
cin >> n >> t;
int64_t s = 0;
insert(1, 1, MAXN, {0, 0});
int64_t dp_n = 0;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
s += x;
int64_t best = query(1, 1, MAXN, i);
int64_t dp_i = s * i - t + best;
insert(1, 1, MAXN, {-s, dp_i});
if (i == n)
dp_n = dp_i;
}
cout << dp_n << '\n';
return 0;
}