Cod sursa(job #1536475)

Utilizator vladrochianVlad Rochian vladrochian Data 26 noiembrie 2015 11:13:43
Problema Euro Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <fstream>

using namespace std;

const int N_MAX = 34567;
const long double INF = 1e100;

ifstream fin("euro.in");
ofstream fout("euro.out");

int N, T;
int S[N_MAX + 5];

int dq[N_MAX + 5];
int64_t best[N_MAX + 5];

long double F(int i, int j) {
   long double a = best[i] - best[j];
   int b = S[i] - S[j];
   if (b >= 0 && a < 0) return -INF;
   if (b <= 0 && a > 0) return INF;
   if (b > 0)
      return a / b;
   return INF;
}

void Update(int i, int j) {
   best[i] = best[j] + int64_t(S[i] - S[j]) * i - T;
}

int main() {
   fin >> N >> T;
   for (int i = 1; i <= N; ++i) {
      fin >> S[i];
      S[i] += S[i - 1];
   }

   for (int i = 1, l = 0, r = 0; i <= N; ++i) {
      while (l < r && i > F(dq[l], dq[l + 1]))
         ++l;
      Update(i, dq[l]);
      while (l < r && F(dq[r], i) <= F(dq[r - 1], dq[r]))
         --r;
      dq[++r] = i;
   }

   fout << best[N] << "\n";
   return 0;
}