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;
#define ll long long
#define ii pair<int,int>
#define fi first
#define se second
#define endl '\n'
#define rep(x,s,e) for (auto x=s-(s>e);x!=e-(s>e);(s<e?x++:x--))
#define sz(x) (int) (x).size()
#define all(x) (x).begin(),(x).end()
struct line{
ll m,c;
line (ll _m,ll _c){
m=_m,c=_c;
}
ll get(ll x){
return m*x+c;
}
};
struct LCH{
deque<line> dq;
double POI(line i,line j){
return (double)(i.c-j.c)/(double)(j.m-i.m);
}
void insert(line i){
//cout<<"debug: "<<i.m<<" "<<i.c<<endl;
while (sz(dq)>=2 && POI(dq.back(),i)<POI(dq[sz(dq)-2],dq.back())) dq.pop_back();
dq.push_back(i);
//for (auto &it:dq) cout<<it.m<<"_"<<it.c<<" ";cout<<endl;
}
ll query(ll x){
while (sz(dq)>=2 && POI(dq[0],dq[1])<x) dq.pop_front();
return dq.front().get(x);
}
} hull=LCH();
int n;
ll arr[1000005];
vector<ii> v;
int main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
cin>>n;
rep(x,0,n){
cin>>arr[x];
if (v.empty() || v.back().fi<arr[x]){
v.push_back(ii(arr[x],1));
}
else{
v.back().se++;
}
}
ll pw=0;
//for (auto &it:v) cout<<it.fi<<" "<<it.se<<endl;
for (auto &it:v) pw+=it.se;
hull.insert(line(pw,0));
ll ans=0;
for (auto &it:v){
ans=hull.query(it.fi);
//cout<<ans<<endl;
pw-=it.se;
hull.insert(line(pw,ans));
}
cout<<ans<<endl;
}
# | 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... |