This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
class CHT {
private:
class Line {
long long m,c;
public:
Line(long long m,long long c) {
this->m=m;
this->c=c;
}
long long getVal(long long x) {
return this->m*x + c;
}
long long intersect(Line &a) {
return ceil((a.c - this->c)/(long double)(this->m - a.m));
}
};
deque<pair<Line,long long>> dq;
public:
void insert(long long m,long long c) {
Line temp(m,c);
while(dq.size()>1 and dq.back().second>=dq.back().first.intersect(temp)) {
dq.pop_back();
}
if(dq.size()==0) {
dq.push_back({temp,0});
} else {
dq.push_back({temp,dq.back().first.intersect(temp)});
}
}
long long query(long long x) {
while(dq.size()>1) {
if(dq[1].second<=x) {
dq.pop_front();
} else {
break;
}
}
return dq[0].first.getVal(x);
}
};
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
long long n;
cin >> n;
vector<long long> a(n);
for(long long i = 0 ; i < n ; i++) {
cin >> a[i];
}
long long dp[n];
dp[0]=a[0]*n;
long long maxi[n];
maxi[0]=a[0];
for(long long i = 0 ; i < n ; i++) {
if(i==0) {
continue;
}
maxi[i]=max(maxi[i-1],a[i]);
}
CHT meat;
meat.insert(n,0);
for(long long i = 0 ; i < n ; i++) {
if(i==0)continue;
meat.insert(n-i,dp[i-1]);
dp[i]=meat.query(maxi[i]);
}
cout << dp[n-1] << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |