Cod sursa(job #3344575)

Utilizator hrazvanHarsan Razvan hrazvan Data 3 martie 2026 11:02:19
Problema Euro Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#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;
}