关于斜率优化代码复杂度
查看原帖
关于斜率优化代码复杂度
506081
BlueSky_楼主2021/10/4 12:16

为什么斜率优化跑得没有暴力快?

#include<bits/stdc++.h>
#define T 4000400
using namespace std;

int n, m, f[T], q[T], l = 1, r = 0, p[T], num[T], sum[T], mx, ans = 2e9, t;

double X (int x) {return num[x];}

double Y (int x) {return f[x] + sum[x];}

double slope (int k, int j)
{
	if (X (k) == X (j))
	{
		if (Y (j) > Y (k)) return 2e9;
		else return -2e9;
	}
	return (Y (j) - Y (k)) / (X (j) - X (k));
}

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> t, p[t+1]++, mx = max (mx, t + 1);
	mx += m;
	for (int i = 1; i <= mx; i++)
		num[i] = num[i-1] + p[i], sum[i] = sum[i-1] + p[i] * i;
	for (int i = 1; i < mx; i++)
	{
		if (i > m)
		{
			while (l < r && slope (q[r], i - m) < slope (q[r-1], q[r])) r--;
			q[++r] = i - m;
		}
		while (l < r && slope (q[l], q[l+1]) < i) l++;
		f[i] = f[q[l]] + (num[i] - num[q[l]]) * i - (sum[i] - sum[q[l]]);
	}
	for (int i = mx - m; i < mx; i++)
		ans = min (ans, f[i]);
	cout << ans;
	return 0;
}

2021/10/4 12:16
加载中...