题目传送门

这道题可以很快想到暴力DP的做法:

f[i]=min(f[i],f[j]+(C[i]-C[j]+i-j--L)^);

但是数据范围有50000,这就需要用斜率优化了。

我们设S[i]=C[i]+i(C[i]为前缀和),L++,设j为i的最优决策点。。

原方程就变为:

f[i]=f[j]+(S[i]-(S[j]-L))^;
f[i]=f[j]+S[i]^2+(S[j]-L)^2-2*S[i]*(S[j]-L);
f[j]+S[i]^2+(S[j]-L)^2=2*S[i]*(S[j]-L)+f[i];
y = k x + b

我们设2*S[i]为k。

相当于这题就变成了求最小的截距f[i]。

假设A,B,C,D为四个决策点。

因为AB的斜率小于f的斜率(2*S[i]),所以它对当前状态的转移一定是没用的。

因为如果要进过A点转移,需要将f"抬高"很多,会大大增大它的截距(f[i])。

所以斜率小于f(当前点)都可以排除。

所以B为最优决策点。

通过B点转移后,如图:

而对于这个New点,它对于之后的点,比D点更优,因为在之后转移时,CNew比CD的斜率更小,所得截距也最小。(由于f的斜率是单调递增的)

这个在凸包上的操作通过单调队列实现。

code:

#include <cstdio>
using namespace std; int read()
{
char c;while(c=getchar(),c<''||c>'');
int x=c-'';while(c=getchar(),c>=''&&c<='')x=x*+c-'';
return x;
} typedef long long LL;
LL N,L,f[],a[];
LL sum[],S[];
LL l[],h,t; double X(int x){return S[x];}
double Y(int y){return f[y]+(S[y]+L-)*(S[y]+L-);}
double get(int x,int y){
return (Y(y)-Y(x))/(X(y)-X(x));
} int main()
{
N=read(),L=read();L++;
register int i;
for(i=;i<=N;i++)a[i]=read();
for(i=;i<=N;i++){
sum[i]=sum[i-]+a[i];
S[i]=sum[i]+i;
}
h=t=;
for(i=;i<=N;i++){
while(h<t&&get(l[h],l[h+])<*S[i])h++;
f[i]=f[l[h]]+(S[i]-S[l[h]]-L)*(S[i]-S[l[h]]-L);
while(h<t&&get(l[t-],l[t])>get(l[t],i))t--;
l[++t]=i;
}
printf("%lld",f[N]);
return ;
}

BZOJ1010_玩具装箱toy_KEY的更多相关文章

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

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

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

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

  3. C++之路进阶——codevs1319(玩具装箱)

    1319 玩具装箱  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description P教授要去看奥运,但是他舍不下他的玩具,于是 ...

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

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

  5. 【BZOJ】【1010】【HNOI2008】玩具装箱Toy

    DP/斜率优化 根据题目描述很容易列出动规方程:$$ f[i]=min\{ f[j]+(s[i]-s[j]+i-j-1-L)^2 \}$$ 其中 $$s[i]=\sum_{k=1}^{i} c[k] ...

  6. 【bzoj1010】[HNOI2008]玩具装箱toy

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

  7. 【斜率DP】BZOJ 1010:玩具装箱

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

  8. BZOJ_1010_[HNOI2008]_玩具装箱toy_(斜率优化动态规划+单调队列)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 给出\(n\)和\(l\).有\(n\)个玩具,第\(i\)个玩具的长度是\(c[i]\ ...

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

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

随机推荐

  1. MFC文档应用程序CToolBar:设置两个工具条并列停靠到同一条边上 转

    转自:http://blog.csdn.net/panshiqu/article/details/9369891# 将多个工具条同时并列停靠在某窗口的某一条边上.对于这种停靠方法,利用上述工具条控制函 ...

  2. Apache2.4.34 + php 7.28 + MySQL8.0.12 安装及配置

    服务端的学习 Apache2.4.34 的安装及配置 1.基本安装 最新的 Apache 已经不提供 Windows 的安装版本,所以我们这里使用的是解压版 -下载地址:https://www.apa ...

  3. Oracle 安全性一

    创建和管理数据库用户账户 用户账户属性 用户账户拥有很多在创建账户时定义的属性.这些属性将应用于连接到账户的会话,在会话运行期间,DBA或会话可以更改其中一些属性. 用户名 身份验证方法 默认表空间 ...

  4. javacript window对象

    Window -- 代表浏览器中一个打开的窗口: 对象属性 window //窗口自身 window.self //引用本窗户window=window.self window.name //为窗口命 ...

  5. js正则表达式——元字符

    元字符 具有特殊意义的元字符 \d 匹配0-9的数字,相当于[0-9] \D 匹配除了0-9的任意字符 \w 匹配0-9.a-z.A-Z._ 的数字或字符,相当于[0-9a-zA-Z_] \W 匹配不 ...

  6. 利用纯JS和HTML Canvas生成随机迷宫过程中产生的有趣的事情

    上效果图: #先看生成随机迷宫的代码吧↓ <html> <head> <title>生成随机迷宫v1.0</title> </head> & ...

  7. code#5 P2 棋子

    棋子   时间限制: 1.0 秒 空间限制: 512 MB 相关文件: 题目目录 题目描述 棋盘从左到右被分割成 n(n≤1000) 个格子,从左到右编号为1,2,...,n.棋盘上有 m(m≤n)  ...

  8. docker故障问题修复

    systemctl start docker启动 systemctl restart docker重启 执行 vi /etc/sysconfig/selinux , 把 selinux 属性值改为di ...

  9. linux学习笔记一:远程连接linux服务器

    环境介绍:win7电脑,通过VM虚拟出linux系统,安装centOS7 通过Xshell连接linux,ftp访问服务器资源. 遇到的问题,ftp连不上linux 解决:linux上安装ftp服务 ...

  10. 微信小程序实现转义换行符

    在html中可以直接使用<br />换行,但是小程序wxml中使用<br />无效,可以换成\n Page({ data: { title: '至少5个字\n请多说些感受吧' ...