为什么斜率优化不加缩距离的优化就会变成65分
查看原帖
为什么斜率优化不加缩距离的优化就会变成65分
93382
_gjm2005_楼主2021/6/13 23:31

时间复杂度也是对的,数组也开的够大了

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

const int N = 2e7 + 10;

#define int long long
#define X(j) (s2[j])
#define Y(j) (f[j] + s1[j])
#define FOR(i,a,b) for(int i = a;i <= b;i++)
#define _FOR(i,a,b) for(int i = a;i >= b;i--)

template<typename T> void read(T &x)
{
    x = 0;int f = 1;
    char c = getchar();
    for(;!isdigit(c);c = getchar()) if(c == '-') f = -1;
    for(;isdigit(c);c = getchar()) x = x * 10 + c - '0';
    x *= f;
}

int n,m,maxx;
int q[N],l,r;
int a[N],s1[N],s2[N],f[N];
long double slope(int k,int j)
{
	if(X(k) == X(j)) 
	{
		if(Y(j) < Y(k)) return -1e18;
		return 1e18;
	}
	return (long double) (1.0 * (Y(j) - Y(k)) / (X(j) - X(k)));
} 

signed main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
	read(n),read(m);
	FOR(i,1,n) 
	{
		read(a[i]);
		maxx = max(maxx,a[i]);
	}
	maxx += m;
	FOR(i,1,n) s2[a[i]]++,s1[a[i]] += a[i];
	FOR(i,1,maxx) s1[i] += s1[i - 1],s2[i] += s2[i - 1];
	q[1] = 0;
	l = r = 1;
	FOR(i,1,maxx)
	{
		if(i >= m)
		{
			while(l < r && slope(q[r - 1],q[r]) >= slope(q[r],i - m)) --r;
			q[++r] = i - m;
		}
		while(l < r && slope(q[l],q[l + 1]) <= i) ++l;
		int tmp = q[l];
		f[i] = f[tmp] + i * (s2[i] - s2[tmp]) - s1[i] + s1[tmp];
	}
	int minx = 1e18;
	FOR(i,maxx - m,maxx) minx = min(minx,f[i]);
	printf("%lld\n",minx);
    return 0;
}
2021/6/13 23:31
加载中...