Submission #1152766

#TimeUsernameProblemLanguageResultExecution timeMemory
1152766AndrijaMDischarging (NOI20_discharging)C++20
100 / 100
68 ms16104 KiB
#include<bits/stdc++.h>

using namespace std;

#define int long long
#define endl '\n'

const int maxn=5e3+10;

double ins(pair<int,int> p1,pair<int,int> p2)
{
    return (p1.second-p2.second)*1.0/(p2.first-p1.first);
}

signed main()
{
    ios::sync_with_stdio(0);
    int n;
    cin>>n;
    vector<int>a(n+1);
    vector<int>dp(n+1);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    vector<pair<int,int>>convexH;
    dp[0]=0;
    int idx=0;
    int last=0;
    for(int i=1;i<=n;i++)
    {
        if(!last || a[i]>a[last])
        {
            for(int j=last+1;j<=i;j++)
            {
                pair<int,int>p={n-j+1,dp[j-1]};
                while(convexH.size()>1 && ins(convexH[convexH.size()-2],convexH.back())>ins(convexH.back(),p))
                {
                    convexH.pop_back();
                }
                convexH.push_back(p);
            }
            last=i;
        }
        idx=min(idx,(int)convexH.size()-1);
        while(idx+1<convexH.size() && ins(convexH[idx],convexH[idx+1])<a[last])
        {
            idx++;
        }
        dp[i]=convexH[idx].first*a[last]+convexH[idx].second;
    }
    cout << dp[n] << '\n';
}
#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...