原文链接http://www.cnblogs.com/zhouzhendong/p/8687797.html

题目传送门 - BZOJ1010

题意

  一个数列$C$,然后把这个数列划分成若干段。

  对于数列$C$的某一段,是从$i$~$j$的,那么就会产生$(i-j+(\sum_{k=i}^j C_k)-L)^2$的花费。

  一种划分方式的花费就是划分出来的每一段产生的花费和。

  求所有不同的划分方式所产生的总花费中最小花费为多少。

  序列长度$\leq 5\times 10^4$。

题解

  看着好像斜率优化啊。

  恩对斜率优化,我们来推式子。

  记

  $dp_i$表示数列$C$的长度为$i$的前缀序列的最小花费。

  $sum_i=\sum_{j=1}^{i}C_j$

  $s_i=sum_i+i$

  于是我们很容易得到:

  $$dp_i=min\{dp_j+(s_i-s_j-1-L)^2\}(0\leq j<i)$$

  然后我们推一推式子。

  $$dp_j+(s_i-s_j-1-L)^2\\=dp_j+s_j^2+2(L+1)s_j-2s_is_j+si^2-2(L+1)s_i+(L+1)^2$$

  假设$j>k$,且选$j$优于选择$k$,则:

  $$dp_j+s_j^2+2(L+1)s_j-2s_is_j+si^2-2(L+1)s_i+(L+1)^2<dp_k+s_k^2+2(L+1)s_k-2s_is_k+si^2-2(L+1)s_i+(L+1)^2$$

  $$\Longrightarrow dp_j+s_j^2+2(L+1)s_j-2s_is_j<dp_k+s_k^2+2(L+1)s_k-2s_is_k$$

  令

  $$x_i=s_i$$

  $$y_i=dp_i+s_i^2+2(L+1)s_j$$

  $$dp_j+s_j^2+2(L+1)s_j-2s_is_j<dp_k+s_k^2+2(L+1)s_k-2s_is_k$$

  $$\Longrightarrow y_j-2s_ix_j<y_k-2s_ix_k$$

  $$\Longrightarrow \frac{y_j-y_k}{x_j-x_k}<2s_i$$

  注意由于开始限制了$j>k$所以$x_j-x_k>0$,所以最后两边同时相除不等式仍然成立。

  设

  $$g_{i,j}=\frac{y_i-y_j}{x_i-x_j}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (i>j)$$

  则上式可以表示为$g_{j,k}<2s_i$

  我们来发掘以下$g_{j,k}$的性质。

  1. 当$g_{j,k}\leq 2s_i$时,由于随着$i$变大,$2s_i$也变大,所以显然从$k$转移是永远不会比$j$好的,所以我们可以把$k$扔掉。

  2. 当$g_{i,j}\leq g_{j,k}$时,从$i$或者$k$转移至少有一个不比$j$差,所以可以把$j$扔掉。为什么??

    若$g_{i,j}\leq 2s_i$,显然$j$要被扔掉,根据第一个性质。

    若$g_{i,j}>2s_i$,则$g_{j,k}>2s_i$,那么显然$j$比$k$差,也得被扔掉。

  于是我们可以用一个单调队列来维护斜率的单调性。

  具体的:

  当情况1发生的时候让队首出队。

  在进队的时候,如果发生情况2,那么先让队尾出队,然后再进队。

  为了避免精度问题,我们可以把$x_i-x_j$乘上来。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=50005;
int n,q[N],head=1,tail=0;
LL L,s[N],dp[N],x[N],y[N];
int main(){
scanf("%d%lld",&n,&L);
for (int i=1;i<=n;i++)
scanf("%lld",&s[i]),s[i]+=s[i-1]+1;
q[++tail]=0;
for (int i=1;i<=n;i++){
int j=q[head+1],k=q[head];
while (tail-head>0&&y[j]-y[k]<=2LL*s[i]*(x[j]-x[k]))
head++,j=q[head+1],k=q[head];
j=k;
dp[i]=dp[j]+(s[i]-s[j]-L-1)*(s[i]-s[j]-L-1);
x[i]=s[i];
y[i]=dp[i]+s[i]*s[i]+2LL*(L+1)*s[i];
j=q[tail],k=q[tail-1];
while (tail-head>0&&(y[i]-y[j])*(x[j]-x[k])<=(y[j]-y[k])*(x[i]-x[j]))
tail--,j=q[tail],k=q[tail-1];
q[++tail]=i;
}
printf("%lld",dp[n]);
return 0;
}

  

BZOJ1010 [HNOI2008]玩具装箱toy 动态规划 斜率优化的更多相关文章

  1. [bzoj1010](HNOI2008)玩具装箱toy(动态规划+斜率优化+单调队列)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有 的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...

  2. 2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)

    传送门 一道经典的斜率优化dp. 推式子ing... 令f[i]表示装前i个玩具的最优代价. 然后用老套路. 我们只考虑把第j+1" role="presentation" ...

  3. BZOJ1010: [HNOI2008]玩具装箱toy(dp+斜率优化)

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 12451  Solved: 5407[Submit][Status][Discuss] Descript ...

  4. bzoj1010: [HNOI2008]玩具装箱toy(斜率优化DP)

    Orz CYC帮我纠正了个错误.斜率优化并不需要决策单调性,只需要斜率式右边的式子单调就可以了 codevs也有这题,伪·双倍经验233 首先朴素DP方程很容易看出:f[i]=min(f[j]+(i- ...

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

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  6. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  7. 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9330  Solved: 3739 Descriptio ...

  8. [HNOI2008]玩具装箱TOY --- DP + 斜率优化 / 决策单调性

    [HNOI2008]玩具装箱TOY 题目描述: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京. 他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器 ...

  9. P3195 [HNOI2008]玩具装箱TOY(斜率优化dp)

    P3195 [HNOI2008]玩具装箱TOY 设前缀和为$s[i]$ 那么显然可以得出方程 $f[i]=f[j]+(s[i]-s[j]+i-j-L-1)^{2}$ 换下顺序 $f[i]=f[j]+( ...

随机推荐

  1. datatables:如何禁用一列的排序

    第一列是checkbox列,不需要排序,所以需要禁用掉. 代码如下: var table = $('#example1').DataTable( { 'paging' : true, 'lengthC ...

  2. UVA 11796

    题意:  有两个狗, 按照 多边形跑,不知道两条狗的速度,但是狗是同时出发,同时到达终点的 输出两条狗的 最大相距距离 - 最小相距距离: 思路 : 用物理的相对运动来计算, 每次只计算 两条狗的直线 ...

  3. 【原创】大数据基础之Logstash(3)应用之file解析(grok/ruby/kv)

    从nginx日志中进行url解析 /v1/test?param2=v2&param3=v3&time=2019-03-18%2017%3A34%3A14->{'param1':' ...

  4. 进程命令ps/top/kill

    进程: 通俗的说就是 当前正在执行的一个程序 命令: ps 英文: process status 作用: 查看进程的详细状况 选项: a:显示终端上的所有进程,包括其他用户的进程 u:显示进程的详细状 ...

  5. 2018 github热门项目

    github流行的几个项目,我们来学习一下. 1. developer-roadmap-chinese image.png 项目简介:2018年web程序员路线中文版, 这个仓库里包含了一些前端,后端 ...

  6. swift 学习- 25 -- 协议 02

    // 通过扩展添加协议一致性 // 即便无法修改源代码, 依然可以通过扩展 令已有类型遵循并符合协议, 扩展可以为已有类型添加属性, 方法, 下标 以及构造器, 因此可以符合协议中的相应要求 // 注 ...

  7. Centos7 linux 卸载自带安装的jdk 并yum自动安装jdk1.8

    一:卸载系统自带安装的JDK 注:本文参考了< 使用CentOS7卸载自带jdk安装自己的JDK1.8> 通过xshell工具成功连接安装好的虚拟机之后可通过    rpm -qa | g ...

  8. Confluence 6 "net.sf.hibernate.PropertyValueException: not-null" 相关问题解决

    如果你遇到了下面的错误信息,例如: ERROR [Importing data task] [confluence.importexport.impl.ReverseDatabinder] endEl ...

  9. vue的多选框

  10. SpringCloud服务提供者

    服务提供者就是提供一个服务暴露出来给别人调用,在springcloud中需要注册服务到服务中心 搭建服务提供者项目(ProduceDemo) 1.创建pom.xml <project xmlns ...