Pagini recente » Cod sursa (job #1297869) | Cod sursa (job #1296554) | Cod sursa (job #1295791)
#include <algorithm>
#include <fstream>
#include <deque>
using namespace std;
typedef long long i64;
const int Nmax = 34580;
int A[Nmax], S[Nmax], Time[Nmax];
i64 Dp[Nmax];
int main()
{
ifstream fin("euro.in");
int N, T;
fin >> N >> T;
for (int i = 1; i <= N; ++i) {
fin >> A[i];
S[i] = S[i - 1] + A[i];
}
fin.close();
deque<int> deq(1, 0);
for (int i = 1; i <= N; ++i) {
while (int(deq.size()) > 1 && Time[deq[1]] == i)
deq.pop_front();
int pos = deq.front();
Dp[i] = Dp[pos] + 1LL * (S[i] - S[pos]) * i - T;
bool ok = true;
while (!deq.empty()) {
pos = deq.back();
Time[i] = i;
for (int step = (1 << 16); step > 0; step >>= 1) {
if (Time[i] + step <= N) {
i64 c1 = Dp[i] + 1LL * (S[Time[i] + step] - S[i]) * (Time[i] + step) - T;
i64 c2 = Dp[pos] + 1LL * (S[Time[i] + step] - S[pos]) * (Time[i] + step) - T;
if (c2 > c1) Time[i] += step;
}
}
Time[i]++;
if (Time[i] == N + 1) {
ok = false;
break;
}
if (Time[i] <= Time[pos]) deq.pop_back();
else break;
}
if (ok) deq.push_back(i);
}
ofstream fout("euro.out");
fout << Dp[N] << '\n';
fout.close();
}