题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1010

首先预处理前缀和sum[i],然后推出初始的dp方程,dp[i]表示装前i件物品的最小费用,v=sum[i]-sum[j]+i-j-1,dp[i]=min(dp[i],dp[j]+(v-l)2)(j<i)。复杂度是O(n2),实测会被卡,这里要斜率优化下,设i>j>k时,由第j项转移到第i项比从第k项转移更优。则有dp[j]+(sum[i]-sum[j]+i-j-1-l)2)<dp[k]+(sum[i]-sum[k]+i-k-1-l)2),展开移项:
(dp[j] + sum[j]*sum[j] + 2*j*sum[j] + 2*sum[j] + j*j + 2*l*sum[j] + 2*l*j + 2*j-(dp[k]+sum[k]*sum[k] + 2*k*sum[k] + 2*sum[k] +k*k + 2*l*sum[k] + 2*l*k+2*k))/(sum[j]+j-(sum[k]+k))<=2*(sum[i]+i);
设f[i]=dp[i] + sum[i]*sum[i] + 2*i*sum[i] + 2*sum[i] + i*i + 2*l*sum[i] + 2*l*i + 2*i。
设T[i]=sum[i]+i。
则上面的式子化为(f[j]-f[k])/(T[j]-T[k])<2T[i]
则当每个点的dp值被求出时,可以在二维坐标系中得到坐标(T[i],f[i])。
用单调队列维护一个下凸包点集,即可O(1)得到最优点。
注意使用long long

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll INF = 9e18 + 7;
 5 const int maxn = 5e5 + 10;
 6 ll dp[maxn];
 7 ll q[maxn];
 8 ll p[maxn];
 9 ll sum[maxn];
10 ll n, l;
11 long long check(int j, int k) {
12     return dp[j] + sum[j] * sum[j] + 2 * j*sum[j] + 2 * sum[j] + j * j + 2 * l*sum[j] + 2 * l*j + 2 * j - dp[k] - sum[k] * sum[k] - 2 * k*sum[k] - 2 * sum[k] - k * k - 2 * l*sum[k] - 2 * l*k - 2 * k;
13 }
14 int main() {
15     scanf("%lld%lld", &n, &l);
16     for (int i = 1; i <= n; i++)
17         scanf("%lld", &p[i]), sum[i] = sum[i - 1] + p[i];
18     ll le = 1, re = 1;
19     q[le] = 0;
20     for (int i = 1; i <= n; i++) {
21         while (le < re&&check(q[le + 1], q[le]) <= (2 * sum[i] + 2 * i)*(sum[q[le + 1]] + q[le + 1] - sum[q[le]] - q[le]))le++;
22         int ans = q[le];
23         ll v = sum[i] - sum[ans] + i - ans - 1;
24         dp[i] = dp[ans] + (v - l)*(v - l);
25         while (le < re&&check(q[re], q[re - 1])*(sum[i] + i - sum[q[re]] - q[re]) >= check(i, q[re])*(sum[q[re]] + q[re] - sum[q[re - 1]] - q[re - 1]))re--;
26         q[++re] = i;
27     }
28     printf("%lld\n", dp[n]);
29 }

转载于:https://www.cnblogs.com/sainsist/p/11116356.html

[Bzoj1010][HNOI2008]玩具装箱toy(斜率优化)相关推荐

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

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

  2. BZOJ1010:[HNOI2008]玩具装箱TOY(斜率优化DP)

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

  3. 【bzoj1010】玩具装箱toy——斜率优化dp

    题目链接 第一道自己推的斜率优化dp>< 首先要明确一点:装进同一个容器的toys一定要是连着的几个(否则的话可以直接贪心)-->之前理解错题意WA了一次...... 用sum[i] ...

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

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

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

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

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

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

  7. 『玩具装箱TOY 斜率优化DP』

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

  8. BZOJ1010 [HNOI2008]玩具装箱toy 动态规划 斜率优化

    原文链接http://www.cnblogs.com/zhouzhendong/p/8687797.html 题目传送门 - BZOJ1010 题意 一个数列$C$,然后把这个数列划分成若干段. 对于 ...

  9. P3195 [HNOI2008]玩具装箱TOY DP+优化

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

最新文章

  1. Qt中文手册 之 QTreeWidget
  2. CocosCreator内置函数实现物体拖动
  3. 2021安新中学高考成绩查询,石家庄二中雄安校区•河北安新中学2019届冲刺高考百日誓师大会...
  4. 周庄不买门票攻略_广东佛山旅游攻略好玩的地方景点推荐
  5. echarts官网打不开。
  6. 安全电子签章密码技术规范_《密码法》中的“密码”,你真的了解吗?
  7. UR5 UR10 ------六自由度机械臂
  8. OpenG: 单模型旋转
  9. 【转自人人】本科生如何发表论文
  10. 电影《无双》中的管理知识
  11. (考试大整理~)Xxy 的车厢调度
  12. 怎么检测声音频率和幅值_作者特稿铝板塑性损伤的电磁超声非线性检测新方法...
  13. 奥运五环的含义及其颜色对应码
  14. React-Navigation的goBack()跳转到指定页面,以及不同栈之间的页面的返回操作
  15. 计算机主板不通电,电脑电源正常,但主板不通电
  16. 设(X1,X2,…,Xn) 是来自正态总体N(μ,σ2),的一个样本,其中μ,σ2未知,求μ与σ2的极大似然估计量.
  17. android 手机误删短信恢复软件,误删除短信恢复大师 for android v4.1 安卓版 恢复Android手机上误删除的短信记录的软件...
  18. 理解计算:从√2到AlphaGo——第2季 神经计算的历史背景
  19. Cocos适配带虚拟导航栏手机(HUAWEI 荣耀6 Plus)
  20. 网络子系统45_ip协议tos处理

热门文章

  1. redis list设置过期时间_面试官:你在Redis中设置过带过期时间的Key吗?
  2. oracle 对象仕途,“事业型”凤凰男为了仕途不顾家,妻子的选择让他措手不及...
  3. php中table,thinkphp中的table方法怎样使用?
  4. Python源码深度解析—引用计数
  5. 2014蓝桥杯C++A:猜年龄;扑克序列(全排列)
  6. bzoj 1682: [Usaco2005 Mar]Out of Hay 干草危机(最小生成树)
  7. win7下U盘安装Ubuntu16.04双系统
  8. 使用opencv中函数实现基于Harris算法的图像角点检测
  9. [转] 面向对象编程 - 继承和多态
  10. matlab2c使用c++实现matlab函数系列教程-binopdf函数