这是 AC 代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+6;
int now=1,n,L,c[N],sum[N],top=1,f[N];
struct node{int l,r,x;}q[N];
int w(int i,int j){
int res=sum[j]-sum[i]-L;
res+=j-i-1;
return res*res;
}
int find(int i){
int l=q[top].l,r=q[top].r,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(f[i]+w(i,mid)<f[q[top].x]+w(q[top].x,mid))r=mid-1,ans=mid;
else l=mid+1;
}
return l;
}
signed main(){
cin>>n>>L;
for(int i=1;i<=n;i++){
cin>>c[i];
sum[i]=sum[i-1]+c[i];
}
now=top=1;
q[top]=(node){1,n,0};
for(int i=1;i<=n;i++){
// cout<<now<<" "<<top<<endl;
f[i]=f[q[now].x]+w(q[now].x,i);
while(i<q[top].l&&f[i]+w(i,q[top].l)<f[q[top].x]+w(q[top].x,q[top].l))top--;
int u=find(i);
q[top].r=u-1;
if(u<=n)q[++top]=(node){u,n,i};
if(i==q[now].r)now++;
}
cout<<f[n]<<endl;
return 0;
}
但是为什么我把二分部分改成
int find(int i){
int l=q[top].l,r=q[top].r,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(f[i]+w(i,mid)<f[q[top].x]+w(q[top].x,mid))r=mid-1,ans=mid;
else l=mid+1;
}
return ans;
}
就会挂