萌新斜率优化求调
查看原帖
萌新斜率优化求调
701221
char_cha_ch楼主2022/11/24 13:53
#include<stdio.h>
#define N 5009
#define int long long

inline int read()
{
	register int ret = 0, f = 1;
	register char ch = getchar();
	while (ch < '0' || ch > '9')
		(ch == '-') ? f = -1 : 0, ch = getchar();
	while (ch >= '0' && ch <= '9')
		ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
	return ret * f;
}

int dp[N], t[N], f[N], q[N];

inline int min(int a, int b) {return a < b ? a : b;}

#define slope(j, k) ((dp[k] - dp[j]) / (1.0 * f[k] - f[j]))

signed main()
{
	register int n = read(), s = read(), i, j, l = 1, r = 0;
	for (i = 1;i <= n;++ i)
		t[i] = read() + t[i - 1], f[i] = read() + f[i - 1];
	for (i = 1;i <= n;++ i)
	{
		dp[i] = 1e15;
		while (l <= r && slope(q[l], q[l + 1]) <= t[i] + s)
			++ l;
		dp[i] = dp[q[l]] + t[i] * (f[i] - f[q[l]]) + s * (f[n] - f[q[l]]);
		while (l <= r && slope(q[r], q[r - 1]) <= slope(q[r], i))
			-- r;
//		for (j = 0;j < i;++ j)
//			dp[i] = min(dp[i], dp[j] + t[i] * (f[i] - f[j]) + s * (f[n] - f[j]));
	}
	printf("%lld", dp[n]);
	
	return 0;
}

看的这篇blog,应该没问题吧。

2022/11/24 13:53
加载中...