Pagini recente » Cod sursa (job #2417148) | Cod sursa (job #1530701) | Cod sursa (job #840513) | Cod sursa (job #3133828) | Cod sursa (job #1518411)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
#define mp make_pair
#define pb push_back
#define maxN 35111
int n, i;
long long t;
long long dp[maxN];
long long sum[maxN];
long long _time[maxN];
int work[maxN];
int qL, qR;
long long getTime(int j1, int j2) {
long long b = dp[j1] - dp[j2];
long long a = sum[j2] - sum[j1];
if (a == 0)
if (b > 0)
return n + 1;
else
return -(n + 1);
if (a < 0)
return (b + a - 1) / -a;
return n + 1;
}
int main()
{
freopen("euro.in","r",stdin);
freopen("euro.out","w",stdout);
scanf("%d%lld", &n, &t);
for (i = 1; i <= n; i++) {
scanf("%lld", &sum[i]);
sum[i] += sum[i - 1];
}
qL = qR = 1;
work[1] = 0;
_time[0] = -n - 18;
for (i = 1; i <= n; i++) {
while (qR - qL + 1 > 1 && _time[ work[qL + 1] ] <= i) qL++;
int prov = work[qL];
dp[i] = dp[prov] - t + (sum[i] - sum[prov]) * i;
while (qR - qL + 1 > 1 && getTime(work[qR], i) <= _time[ work[qR] ]) qR--;
_time[i] = getTime(work[qR], i);
work[++qR] = i;
}
printf("%lld", dp[n]);
return 0;
}