Pagini recente » Cod sursa (job #2669135) | Cod sursa (job #2775007) | Cod sursa (job #1149327) | Cod sursa (job #897150) | Cod sursa (job #2595614)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 35000;
const int INF = (1 << 30);
int N, T, v[NMAX];
long long sum[NMAX], dp[NMAX];
int dq[NMAX], leftdq, rightdq;
long double cht(int ind1, int ind2)
{
if (sum[ind1] == sum[ind2])
{
if (dp[ind1] >= dp[ind2])
return -INF;
else
return INF;
}
if (-sum[ind1] < -sum[ind2])
return -INF;
return (long double)(dp[ind2] - dp[ind1]) / (long double)(sum[ind2] - sum[ind1]);
}
int main()
{
ifstream fin("euro.in");
ofstream fout("euro.out");
fin >> N >> T;
for (int i = 1;i <= N;++i)
{
fin >> v[i];
sum[i] = sum[i - 1] + v[i];
}
for (int i = 1;i <= N;++i)
{
while (leftdq < rightdq && -sum[dq[leftdq]] * i + dp[dq[leftdq]] < -sum[dq[leftdq + 1]] * i + dp[dq[leftdq + 1]])
++leftdq;
dp[i] = 1LL * (sum[i] - sum[dq[leftdq]]) * i + dp[dq[leftdq]] - T;
while (rightdq > leftdq && cht(dq[rightdq - 1], dq[rightdq]) > cht(dq[rightdq], i))
--rightdq;
dq[++rightdq] = i;
}
fout << dp[N] << "\n";
fin.close();
fout.close();
return 0;
}