0pts 斜率优化求调
查看原帖
0pts 斜率优化求调
1078013
qsn123楼主2025/1/3 16:35

救救孩子吧,拍一个下午了QAQ

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=50050;
int l,r;
ll c[N],f[N],q[N];
int main()
{
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++){
		scanf("%lld",&c[i]);
		c[i]+=c[i-1];
	}
	l=r=1;
	q[0]=c[0]=f[0]=0;
	for(int i=1;i<=n;i++){
		ll p=i+c[i];
		while(l<r){
			ll x1=q[l]+c[q[l]]+1+k,x2=q[l+1]+c[q[l+1]]+1+k;
			if(f[q[l+1]]+x2*x2-f[q[l]]-x1*x1<=p*(x2-x1))l++;
			else break;
		}
		f[i]=f[q[l]]+1ll*(p-q[l]-c[q[l]]-1-k)*(p-q[l]-c[q[l]]-1-k);
		ll x=i+c[i]+1+k;
		while(l<r){
			ll x1=q[r-1]+c[q[r-1]]+1+k,x2=q[r]+c[q[r]]+1+k;
			if(f[i]+x*x+f[q[r-1]]+x1*x1<=2*(f[q[r]]+x2*x2))r--;
			else break;
		}
		r++;
		q[r]=i;
	}
	printf("%lld",f[n]);
	return 0;
}
2025/1/3 16:35
加载中...