求助,样例没过
查看原帖
求助,样例没过
548699
Zhangrx__楼主2022/5/26 19:01
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll M=50001;
ll n,c[M],m;
ll sumc[M];
ll q[M];
ll dp[M];//dp[i]表示前i件物品划分最小花费
ll pow1(ll x){
	return x*x;
}
ll work1(ll x){//x轴 
	return pow1(sumc[x]+m+x);
}
ll work2(ll x){//y轴 
	return dp[x]+pow1(sumc[x]+x+m);
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++)scanf("%lld",&c[i]);
	for(ll i=1;i<=n;i++)sumc[i]=sumc[i-1]+c[i];
	ll l=1,r=1;
	m++;
	memset(dp,0x3f,sizeof dp);
	dp[0]=0;
	for(ll i=1;i<=n;i++){
		while(l<r&&(work2(q[l+1])-work2(q[l]))<=2*(sumc[i]+i)*(work1(q[l+1])-work1(q[l])))l++;
		dp[i]=dp[q[l]]+pow1(sumc[i]+i-sumc[q[l]]-q[l]-m);
		while(l<r&&(work2(q[r])-work2(q[r-1]))*(work1(i)-work1(q[r]))>=(work2(i)-work2(q[r]))*(work1(q[r-1])-work1(q[r])))r--;
		q[++r]=i;
	}
	printf("%lld",dp[n]);
	return 0;
}
2022/5/26 19:01
加载中...