为什么斜率优化跑得没有暴力快?
#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;
}