Submission #524012

#TimeUsernameProblemLanguageResultExecution timeMemory
524012DanerZeinDischarging (NOI20_discharging)C++14
13 / 100
1006 ms8208 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=1e6+10; struct line{ ll m,b; line(ll mm,ll bb){ m=mm; b=bb; } ll eval(ll x){ return m*x+b; } /*long double intersect(line l){ return (long double)(b-l.b)/(l.m-m); }*/ ll intersect(line l){ ll le=0,ri=1e12+1; while(ri-le>1){ ll mid=(le+ri)/2; if(eval(mid)<=l.eval(mid)) ri=mid; else le=mid; } return ri; } }; ll val[MAX_N]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>val[i]; } deque<line> dq; dq.push_front({0,0}); ll ans=0; for(int i=1;i<=n;i++){ int t=dq.size(); line nl={-i,ans}; while(t>=2 && nl.intersect(dq[t-2])<=dq[t-1].intersect(dq[t-2])){ dq.pop_back(); t--; } dq.push_back(nl); while(dq.size()>=2 && dq[0].eval(val[i])>=dq[1].eval(val[i])) dq.pop_front(); ans=dq.front().eval(val[i])+val[i]*(n+1); } cout<<ans<<endl; }
#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...