求助,样例没过
查看原帖
求助,样例没过
520056
luoyx楼主2023/4/1 11:27
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,L;
const int N=1e5+5;
int c[N];
int q[N],h,t;
int f[N];
int x(int p){
	return c[p]-p;
}
int y(int p){
	return f[p]+(c[p]-p)*(c[p]-p);
}
int k(int p){
	return 2*(c[p]-p-L+1);
}
signed main(){
	cin>>n>>L;
	for(int i=1;i<=n;i++){
		cin>>c[i];
		c[i]+=c[i-1];
	}
	for(int i=1;i<=n;i++){
		int l=h,r=t;
		while(l<r){
			int mid=l+r>>1;
			if(y(q[mid+1])-y(q[mid])>k(i)*(x(q[mid+1])-x(q[mid]))) r=mid;
			else l=mid+1;
		}
		int j=q[l];
		f[i]=f[j]+(j-i+c[i]-c[j]-L+1)*(j-i+c[i]-c[j]-L+1);
		while(h<t&&(y(q[t])-y(q[t-1]))*(x(i)-x(q[t]))>=(y(i)-y(q[t]))*(x(q[t])-x(q[t-1]))) t--;
		q[++t]=i;
	}
	cout<<f[n]; 
}
2023/4/1 11:27
加载中...