斜率优化dp模板求条
  • 板块学术版
  • 楼主MinimumSpanningTree最小生成树
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/5/19 21:18
  • 上次更新2024/5/21 14:03:53
查看原帖
斜率优化dp模板求条
398152
MinimumSpanningTree最小生成树楼主2024/5/19 21:18

站外题,除了 #1 其他都 WA 了。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=5e5+100;
typedef long long ll;
int n,m,q[N],l,r;
ll a[N],dp[N];
ll get_x(ll x)
{
	return 2*a[x];
}
ll get_y(ll x)
{
	return dp[x]+a[x]*a[x];
}
ll slope_fz(ll x,ll y)
{
	return get_y(x)-get_y(y);
}
ll slope_fm(ll x,ll y)
{
	return get_x(x)-get_x(y);
}
int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		dp[0]=q[0]=q[1]=0,l=1,r=0;
		for(int i=1;i<=n;i++) 
		{
			scanf("%lld",&a[i]);
			a[i]+=a[i-1];
		}
		for(int i=1;i<=n;i++)
		{
			while(l<=r&&slope_fz(q[l+1],q[l])<=a[i]*slope_fm(q[l+1],q[l])) l++;
			dp[i]=dp[q[l]]+m+(a[i]-a[q[l]])*(a[i]-a[q[l]]);
			while(l<=r&&slope_fz(i,q[r])*slope_fm(q[r],q[r-1])<=slope_fz(q[r],q[r-1])*slope_fm(i,q[r])) r--;
			q[++r]=i;
		}
		printf("%lld\n",dp[n]);
	}
	return 0;
}
2024/5/19 21:18
加载中...