刷斜率优化成性
我感觉我已经走火入魔了
下面是代码
#include<cstdio>
#include<iostream>
using namespace std;
long long n,num[1000005];
long long f[1000005],q[1000005],h,t;
long long M(long long x){
return x*x;
}
double xie(long long k,long long j){
return (2.0*f[j]-2.0*f[k]+M(j)-M(k)+j-k)/2.0/(j-k);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>num[i];
}
f[0]=0;h=t=1;q[1]=0;
for(int i=1;i<=n;i++){
while(h<t&&xie(q[h+1],q[h])<=i){
h++;
}
int j=q[h];
f[i]=f[j]+(i-j)*(i-j-1)/2+num[i];
while(h<t&&xie(q[t],q[t-1])>xie(i,q[t])){
t--;
}
q[++t]=i;
}
cout<<f[n]<<endl;
return 0;
}
/*
in:
10
2 3 1 5 4 5 6 3 1 2
out:
18
*/