Submission #1300124

#TimeUsernameProblemLanguageResultExecution timeMemory
1300124KhoaDuyDischarging (NOI20_discharging)C++20
100 / 100
76 ms10596 KiB
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
struct line{
    long long a,b;
};
deque<line> dq;
long long interX(line &x,line &y){
    return ((y.b-x.b)/(x.a-y.a));
}
void add(line &x){
    while(dq.size()>=2){
        line temp=dq.back();
        dq.pop_back();
        if(interX(x,temp)>interX(temp,dq.back())){
            dq.push_back(temp);
            break;
        }
    }
    dq.push_back(x);
}
long long query(int x){
    while(dq.size()>=2){
        line temp=dq.front();
        dq.pop_front();
        if(interX(temp,dq.front())>=x){
            dq.push_front(temp);
            break;
        }
    }
    return (1LL*dq.front().a*x+dq.front().b);
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n;
    cin >> n;
    vector<pair<int,int>> v;
    for(int i=0;i<n;i++){
        int x;
        cin >> x;
        if(v.empty()||x>v.back().first){
            v.push_back({x,i});
        }
    }
    long long DP[v.size()+1];
    DP[v.size()]=0;
    line temp;
    temp.b=0,temp.a=v.back().first;
    add(temp);
    for(int i=v.size()-1;i>=0;i--){
        DP[i]=query(n-v[i].second);
        if(i>0){
            temp.b=DP[i],temp.a=v[i-1].first;
            add(temp);
        }
    }
    cout << DP[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...