蒟蒻的垂死挣扎
当大佬跟我说这个是斜率优化入门题的时候,我是拒绝的。
好吧这题确实有点水甚至一个假的代码居然都ac了。
斜率优化的原理什么的我是不会讲的放心吧我现在都忙得死= =。
这一题随意推一推柿子可以啦。记得在初始队列中插一个0
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<queue>
#define RG register
#define N 50010
#define ll long long
const ll inf = 1e16 + 7 ;
using namespace std;
inline ll read(){
ll x=0,o=1; char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') o=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*o;
}
ll n,L,Q[N],a[N],sum[N],f[N],top,tail;
inline double X(RG ll x) { return (sum[x]+x)*2; }
inline double Y(RG ll x) { return sum[x]+x+L+1; }
inline double Slope(RG ll x,RG ll y){
RG double Yx=Y(x),Yy=Y(y);
return 1.0*(f[y]-f[x])/(Yy-Yx)+Yx+Yy;
}
int main(){
n=read(),L=read();
for(RG ll i=1;i<=n;++i) a[i]=sum[i]=read(),sum[i]+=sum[i-1];
Q[top=++tail]=0;
for(RG ll i=1;i<=n;++i){
while((tail-top)&&Slope(Q[top],Q[top+1])<X(i)) ++top;
f[i]=f[Q[top]]+(X(i)/2.0-Y(Q[top]))*(X(i)/2.0-Y(Q[top])); //cout<<f[i]<<' ';
while((tail-top)&&Slope(Q[tail-1],Q[tail])>=Slope(Q[tail-1],i)) --tail;
Q[++tail]=i;
} cout<<f[n];
}