洛谷P3195 玩具装箱TOY

题目大意:

有n个数,要将他们分成若干段,每一段的cost定义为: cost=r-l+ΣCk (k∈[r,l]) 该段的最终花费是:(cost-L)^2; 给出L,n,C(1~n),总共的最小花费。

分析:

dp方程极容易想出来: f[i]=max(f[j]+(sum[i]-sum[j]+i-j-1-L)^2) 其中sum[i]表示c(1~i)的和。因为取的这一段数从j+1开始,所以i-j-1(题目中i-j并不是区间长度!没有再加1)

O(n^2)直接挂掉。

因为状态O(n)已经非常不错,无法再优化了。所以考虑能不能优化转移的O(n)。

将表达式展开:

f[i]=f[j]+(sum[i]-sum[j]+i-j-1-L)^2

令a[k]=sum[k]+k;x[k]=a[k]+1+ f[i]=f[j]+(a[i]-x[j])^2

f[i]=f[j]+x[j]^2-2a[i]x[j]+a[i]^2

对于给定的i,a[i]^2是一个定值,所以当做常数先不用管,但是记得最后加上!

令y[k]=f[k]+x[k]^2; f[i]=y[j]-2a[i]x[j]

移项: y[j]=2a[i]x[j]+f[i]

对于给定的i,我们需要循环所有的j。 对于一个j,我们已经知道了x[j],y[j]。 将它看作一个点,所有的j构成一个点集,横坐标x[j],纵坐标y[j]

而对于给定的i,2a[i]是一个定值,看做斜率,而目标f[i]则是截距,所以要在j的点集之中找到一个点使得这条直线截距最小,本质是将y=2a[i]x的直线平移。

可以发现这些最优解的点必定在边界上。并且发现,斜率是单增的,而x一定也是单增的。所以可以维护一个左上下凸壳。

因为斜率单增,所以若一个点此时不是最优解,那么以后一定也不是最优解,可以直接从头pass掉;每次新增一个点,都要保证这是一个凸包,通过斜率要来从尾pass掉。

所以可以用单调队列维护!单调,在这里是指队列中的元素,每相邻两个元素所代表的点连成的线,其斜率是单调递增的。因为斜率都是正数,所以也就是画出来是一个左上凸包。

注意,队列中至少要有一个0号元素不能出队!这里第一个空位置是有意义的。否则就不存在线和斜率了。所以手写队列时,开始hd=tl=0,while判断中hd<tl 保证一定至少有一个元素,并且这个元素不会被其他元素替代。详见代码。

具体步骤:

1.前缀和预处理

2.循环i,先删除队首,再更新答案,再更新队列。

3.输出f[n] GAME OVER

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=50000+10;
int n,L;
long long f[N];
long long sum[N];
int q[N],hd,tl;
long long a(int i)
{
    return sum[i]+i;
}
long long x(int i)
{
    return sum[i]+i+L+1;
}
long long y(int i)
{
    return x(i)*x(i)+f[i];
}
double slope(int a,int b)
{
    return  ((double)y(b)-y(a))/((double)x(b)-x(a));
}//一堆函数
int t;
int main()
{
    scanf("%d%d",&n,&L);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&t);
        sum[i]=sum[i-1]+t;
    }
    hd=0,tl=0;
    for(int i=1;i<=n;i++)
    {
        while(hd<tl&&slope(q[hd],q[hd+1])<2*a(i)) hd++;//删除
        f[i]=y(q[hd])-2*a(i)*x(q[hd])+a(i)*a(i);
        while(hd<tl&&slope(q[tl-1],q[tl])>slope(q[tl-1],i)) tl--;
        q[++tl]=i;//更新
    }
    printf("%lld",f[n]);
    return 0;
}

总结:

1.一个题能用斜率优化,必然能出现y=kx+b 线性形式,其中k是定值,x,y构成点集,b是目标值。

2.一个凸包能用单调队列优化的条件应该满足:

(1)查询的斜率单调 (2)插入的点横坐标有单调性 (否则要用平衡树、set)

原文地址:https://www.cnblogs.com/Miracevin/p/9031615.html

时间: 2024-10-12 22:13:10

洛谷P3195 玩具装箱TOY的相关文章

BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P

BZOJ 1010 [HNOI2008]玩具装箱toy

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7184  Solved: 2724[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P

BZOJ 1010: [HNOI2008]玩具装箱toy(DP+斜率优化)

[HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为

bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7874  Solved: 3047[Submit][Status][Discuss] Description P 教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维 容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理

HNOI2008 玩具装箱toy (BZOJ1010,斜率dp)

传送门 1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Description P 教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维 容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的. 同时如果一个一维容器中有多个玩具,那么两件玩

BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器

bzoj1010【HNOI2008】玩具装箱 toy

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 8678  Solved: 3456 [Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过 压缩后变成一维长度为Ci.为了方便

bzoj 1010: [HNOI2008]玩具装箱toy 2011-12-27

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2254  Solved: 744[Submit][Status][Discuss] DescriptionP 教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维 容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P

BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<