Cod sursa(job #1295790)

Utilizator andreiiiiPopa Andrei andreiiii Data 20 decembrie 2014 10:49:54
Problema Euro Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#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();
}