WA 90pts求调
查看原帖
WA 90pts求调
1041592
will1111楼主2025/7/31 16:20

rt

#include<iostream>
#include<cstdio>
#include<vector>

using namespace std;


int main()
{
	int n;
	long long L;
	scanf("%d%lld",&n,&L);
	vector<long long>c(n+2,0);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&c[i]);
		c[i]+=c[i-1];
	}
	vector<long long>dp(n+2,0);
	vector<int>pos(n+2,0);
	int l=1,r=1;
	auto slope=[&dp,&c](int l,int r)
	{
		return 1.0*(dp[r]+c[r]*c[r]-dp[l]-c[l]*c[l])/(c[r]-c[l]);
	};
	for(int i=1;i<=n;i++)
	{
		while(l<r&&slope(pos[l],pos[l+1])<2.0*(i-pos[l]-1+c[i]-L))
		{
			l++;
		}
		int j=pos[l];
		dp[i]=dp[j]+(i-j-1+c[i]-L-c[j])*(i-j-1+c[i]-L-c[j]);
		while(l<r&&slope(pos[r],i)<slope(pos[r],pos[r-1]))
		{
			r--;
		}
		pos[++r]=i;
	}
	cout<<dp[n]<<endl;
	return 0;
}

评测记录

2025/7/31 16:20
加载中...