Cod sursa(job #1742999)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 17 august 2016 14:05:03
Problema Euro Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <vector>
#include <functional>
using namespace std;

constexpr int kMaxN = 34567;
constexpr double INF = 1e16;

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<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 int64_t b = dp[y] - dp[x]; 
    if (a == 0LL) {
      if (b > 0LL) {
        return -1e16;
      } else {
        return 1e16; 
      }
    } else if (a > 0LL) {
      return 1.0 * -b / a;
    } else {
      return 1e16;
    }
  };

  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;
}