传送门

一道经典的斜率优化dp。

推式子ing。。。

令f[i]表示装前i个玩具的最优代价。

然后用老套路。

我们只考虑把第j+1" role="presentation" style="position: relative;">j+1j+1~i" role="presentation" style="position: relative;">ii个玩具分成一组的情况,之前的1~j个自行按最优情况分组。

显然有f[i]=f[j]+(sum[i]−sum[j]+L)2" role="presentation" style="position: relative;">f[i]=f[j]+(sum[i]−sum[j]+L)2f[i]=f[j]+(sum[i]−sum[j]+L)2

那么对于决策j,k。

谁对i的贡献更优呢?

我们假设j更优。

显然有

f[i]=f[j]+(sum[i]−sum[j]+L)2&lt;f[i]=f[k]+(sum[i]−sum[k]+L)2" role="presentation" style="position: relative;">f[i]=f[j]+(sum[i]−sum[j]+L)2<f[i]=f[k]+(sum[i]−sum[k]+L)2f[i]=f[j]+(sum[i]−sum[j]+L)2<f[i]=f[k]+(sum[i]−sum[k]+L)2

=>f[j]+sum[j]2−2sum[i]∗sum[j]&lt;f[k]+sum[k]2−2sum[i]∗sum[k]" role="presentation" style="position: relative;">f[j]+sum[j]2−2sum[i]∗sum[j]<f[k]+sum[k]2−2sum[i]∗sum[k]f[j]+sum[j]2−2sum[i]∗sum[j]<f[k]+sum[k]2−2sum[i]∗sum[k]

设T[t]=f[t]+sum[t]2" role="presentation" style="position: relative;">T[t]=f[t]+sum[t]2T[t]=f[t]+sum[t]2

=>(T[j]−T[k])/(sum[j]−sum[k])&lt;2sum[i]" role="presentation" style="position: relative;">(T[j]−T[k])/(sum[j]−sum[k])<2sum[i](T[j]−T[k])/(sum[j]−sum[k])<2sum[i]

这不就是斜率优化么?

用队列维护一下就行了。

继续分析会发现应该维护单调递增的斜率,也就是维护一个下凸壳。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 50005
using namespace std;
inline ll read(){
    ll ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int n,hd,tl,q[N];
ll L,sum[N],f[N];
inline ll gety(int i,int j){return f[i]-f[j]+sum[i]*sum[i]-sum[j]*sum[j];}
inline ll getx(int i,int j){return sum[i]-sum[j];}
inline double slope(int i,int j){return 1.0*gety(i,j)/getx(i,j);}
int main(){
    n=read(),L=read()+1,hd=tl=1;
    for(int i=1;i<=n;++i)sum[i]=sum[i-1]+read();
    for(int i=1;i<=n;++i){
        sum[i]+=i;
        while(hd<tl&&slope(q[hd+1],q[hd])<=2*(sum[i]-L))++hd;
        f[i]=f[q[hd]]+(sum[i]-L-sum[q[hd]])*(sum[i]-L-sum[q[hd]]);
        while(hd<tl&&slope(q[tl],q[tl-1])>slope(i,q[tl]))--tl;
        q[++tl]=i;
    }
    cout<<f[n];
    return 0;
}

2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)的更多相关文章

  1. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 11893  Solved: 5061[Submit][S ...

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

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

  3. 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp

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

  4. [bzoj1010][HNOI2008]玩具装箱toy_斜率优化dp

    玩具装箱toy bzoj-1010 HNOI-2008 题目大意:P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一 ...

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

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

  6. P3195 [HNOI2008]玩具装箱TOY 斜率优化dp

    传送门:https://www.luogu.org/problem/P3195 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任 ...

  7. [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)

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

  8. bzoj1010: [HNOI2008]玩具装箱toy——斜率优化

    方程 $\Large f(i)=min(f(j)+(s(i)-s(j)-1-L)^2)$ 其中$s(i)$为i的前缀和再加上$i$ 对于某个$i$若$j$比$k$优,则 $\large f(j)+(s ...

  9. 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP

    题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...

随机推荐

  1. leetcode453

    public class Solution { public int MinMoves(int[] nums) { var list = nums.OrderBy(x => x).ToList( ...

  2. xe7 Unresolved external CSPIN.OBJ

    工程里打开使用了CSPIN控件的界面窗体,再编译就好了 [ilink32 Error] Error: Unresolved external 'Vcl::Controls::TControl::Set ...

  3. Swagger从入门到精通

    https://legacy.gitbook.com/book/huangwenchao/swagger/details 如何编写基于OpenAPI规范的API文档 [TOC] 前言 编写目的 本文介 ...

  4. Activity服务类-5 IdentityService服务类

    一.内置用户组(角色)设计表概念 用户和组(或者叫做角色),多对多关联,通过关联表实现 act_id_user 用户表: act_id_group 用户组表: act_id_membership 用户 ...

  5. UI5-文档-4.31-Routing and Navigation

    到目前为止,我们已经把所有的应用程序内容放在一个页面上.随着我们添加越来越多的特性,我们希望将内容拆分并将其放在不同的页面上. 在这一步中,我们将使用SAPUI5导航特性加载并显示一个单独的详细信息页 ...

  6. Asp.Net Core参考资料

    Every day up!!!!!! 1.Asp.Net官方文档 2.<Professional C# 6 and .NET Core 1.0> 翻译 3.ASP.NET Core中文文档 ...

  7. SpringBoot application.yml文件不生效

    yml格式对缩进有严格的要求,检查你的yml配置文件是否有不合格的缩进项. 正确的格式如下: server: port: 8881 port前必须有空格,  port后的冒号 后面也需要有空格

  8. 1Java语言概述——重拾Java

    1.1 Java 语言诞生 Java 是1995 年 由 Sun公司开发的革命性编程语言. 1.2 Java 的特点 序号 主题 描述 1 简单 比C++简单 2 面向对象 基于对象的编程更符合人的思 ...

  9. pyplot文本显示

    pyplot文本显示 pyplot中文字符显示 pyplot默认不支持中文字符,因为默认字体是sans-serif,英文字体不能显示中文 方法1,修改需要输出中文字符的地方 在有中文输出的地方,添加属 ...

  10. scala 稀疏向量

    http://mocom.xmu.edu.cn/article/show/58481eb2e083c990247075a5/0/1 1. /创建一个标签为1.0(分类中可视为正样本)的稠密向量标注点 ...