Cod sursa(job #3359677)

Utilizator rares89_Dumitriu Rares rares89_ Data 1 iulie 2026 21:31:09
Problema Euro Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#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;
}