斜率dp的模板总结

Posted shineeternal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了斜率dp的模板总结相关的知识,希望对你有一定的参考价值。

#include<cstdio>
#include<algorithm>
using namespace std;
long long sumt[40005],sum[40005],f[40005],q[40005];
double X(long long x)
{
    return sumt[x];
} 
double Y(long long x)
{
    return (f[x]+sum[x]);
}
double slope(long long a,long long b)
{
    return ((Y(a)-Y(b))/(X(a)-X(b)));
}
struct ben
{
    long long t,r;
}a[40005],b[40005];
long long cmp(const ben &a,const ben &b)
{
    return a.t>b.t;
}
int main()
{
    freopen("nt2011_design.in","r",stdin);
    freopen("nt2011_design.out","w",stdout); 
    long long l=0,r=0;
    long long n,m;
    scanf("%lld%lld",&n,&m);
    for(long long i=1;i<=n;i++)
    {
        scanf("%lld%lld",&a[i].t,&a[i].r);
    }
    sort(a+1,a+n+1,cmp);
    for(long long i=1;i<=n;i++)
    {
        if(a[i].t==a[i+1].t)
        {
            a[i+1].r+=a[i].r;
            a[i].r=0;
        }
    }
    long long cnt=0;
    for(long long i=1;i<=n;i++)
    {
        if(a[i].r!=0)
        {
            b[++cnt]=a[i];
        }
    }
    long long maxt=b[1].t;
    b[cnt+1].t=0;
    b[cnt+1].r=0;
    cnt++;
    for(long long i=1;i<=cnt;i++)
    {
        b[i].t=maxt-b[i].t;
        sumt[i]=sumt[i-1]+b[i].r;
        sum[i]=sum[i-1]+b[i].t*b[i].r;
    }
    for(long long i=1;i<=cnt;i++)
    {
        while(l<r&&slope(q[l+1],q[l])<b[i].t)l++;
        f[i]=f[q[l]]+b[i].t*(sumt[i]-sumt[q[l]])-(sum[i]-sum[q[l]]);
        if(i!=cnt)f[i]+=m;
        while(l<r&&slope(i,q[r-1])<slope(q[r-1],q[r]))r--;
        q[++r]=i;
    }
    printf("%lld\n",f[cnt]);
    return 0; 
}

以上是关于斜率dp的模板总结的主要内容,如果未能解决你的问题,请参考以下文章

模板斜率优化dp的常用模板

HDU1300 Pearls (斜率dp模板题)

斜率优化总结

以前的空间斜率优化的一点点总结

斜率优化(DP)

HDU 3507 Print Article(斜率优化DP)