Submission #335918

#TimeUsernameProblemLanguageResultExecution timeMemory
335918mihai145Discharging (NOI20_discharging)C++14
100 / 100
151 ms24556 KiB
#include <iostream>
#include <deque>

using namespace std;

struct Line
{
    long long m, n;

    long long eval(long long x)
    {
        return m * x + n;
    }

    long double intersect(Line l)
    {
        return (1.0 * (l.n - n)) / (1.0 * (m - l.m));
    }
};

struct CHT
{
    deque <Line> dq;

    void Insert(Line l)
    {
        while((int)dq.size() > 1 && dq.end()[-1].intersect(l) < dq.end()[-2].intersect(dq.end()[-1]))
            dq.pop_back();

        dq.push_back(l);
    }

    long long Query(long long x)
    {
        while(dq.size() > 1 && dq[0].intersect(dq[1]) < x)
            dq.pop_front();

        return dq[0].eval(x);
    }
};

const int NMAX = 1e6;

int N;
long long T[NMAX + 5], dp[NMAX + 5];

CHT cht;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> N;
    for(int i = 1; i <= N; i++)
        cin >> T[i];

    dp[0] = 0;
    cht.Insert({-1, 0});

    long long runningMax = 0;
    for(int i = 1; i <= N; i++)
    {
        runningMax = max(runningMax, T[i]);
        dp[i] = runningMax * (N + 1) + cht.Query(runningMax);
        cht.Insert({-(i + 1), dp[i]});
    }

    cout << dp[N] << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...