Cod sursa(job #1743034)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 17 august 2016 14:36:09
Problema Euro Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.42 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, 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, 0LL);
 
 vector<int> convex_hull(n + 1, 0); // deque de linii
 int dqHead = 0, dqTail = 1;
 
 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 >= 0 and b > 0) {
     return -INF;
   } else if (a <= 0 and b < 0) {
     return INF;
   } else if (a > 0) {
     return 1.0 * -b / a;
   } else {
     return INF;
   }
 };
 
 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;
}