如下,将宏定义注释,将原注释部分函数恢复后后结果会不同。
虽然结果都不对(雾)
#include<bits/stdc++.h>
#define int long long
#define min(a,b) a<b?a:b
#define f1(i,n,m) for(int i=n;i<=m;++i)
#define N 300005
#define db double
#define a(i) c[i]+i
#define b(i) c[i]+i+L+1
#define x(i) b(i)
#define y(i) dp[i]+b(i)*b(i)
using namespace std;
template <typename T>
void read(T &x){
int w=1;x=0;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
x*=w;
}
int n,L,l,r,p;
int c[N],q[N],dp[N];
//db a(int i){return c[i]+i;}
//db b(int i){return c[i]+i+L+1;}
//db x(int i){return b(i);}
//db y(int i){return dp[i]+b(i)*b(i);}
signed main(){
read(n),read(L);
f1(i,1,n)read(c[i]),c[i]+=c[i-1];
l=r=1;
f1(i,1,n){
while(l<r&&(y(l+1)-y(l))<=2*a(i)*x(l+1)-x(l))++l;
p=q[l];dp[i]=dp[p]+(a(i)-b(p))*(a(i)-b(p));
while(l<r&&(x(i)-x(l))*(y(l)-y(l-1))>=(y(i)-y(l))*(x(l)-x(l-1)))--r;
q[++r]=i;
}
printf("%lld",dp[n]);
return 0;
}