Pagini recente » Cod sursa (job #2814173) | Cod sursa (job #2437345) | Cod sursa (job #1426607) | Cod sursa (job #3214416) | Cod sursa (job #775190)
Cod sursa(job #775190)
#include <cmath>
#include <fstream>
#include <algorithm>
#include <deque>
using namespace std;
const long long INF = 1LL << 60;
const int INFi = 0x3f3f3f3f;
int N, T;
int A[35000], S[35000];
long long maxC[35000];
deque<int> D;
inline int timego(const int& i1, const int& i2) // cand depaseste i1 pe i2
{
if (S[i1] > S[i2]) return INFi;
if (S[i1] == S[i2]) return (maxC[i1] >= maxC[i2] ? 0 : INFi);
return ceil(1.0L * (maxC[i1] - maxC[i2]) / (S[i1] - S[i2]));
}
int main()
{
ifstream fin("euro.in");
ofstream fout("euro.out");
fin >> N >> T;
for (int i = 1; i <= N; ++i)
{
fin >> A[i];
S[i] = S[i - 1] + A[i];
}
D.push_back(0);
for (int i = 1; i <= N; ++i)
{
while (D.size() >= 2 && timego(D[1], D[0]) <= i)
D.pop_front();
maxC[i] = maxC[D.front()] + 1LL * (S[i] - S[D.front()]) * i - T;
while (D.size() >= 2 && timego(D[D.size() - 1], D[D.size() - 2]) >= timego(i, D[D.size() - 1]))
D.pop_back();
if (timego(i, D[D.size() - 1]) != INFi)
D.push_back(i);
}
fout << maxC[N] << '\n';
fin.close();
fout.close();
}