Cod sursa(job #2595614)

Utilizator trifangrobertRobert Trifan trifangrobert Data 8 aprilie 2020 00:07:55
Problema Euro Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#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;
}