当前位置: 首页 > news >正文

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

Description

  P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压
缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过
压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容
器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一
个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j 制作容器的费用与容器的长度有关,根据教授研究,
如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。P教授不关心容器的数目,他可以制作出任意长度的容
器,甚至超过L。但他希望费用最小.

Input

  第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7

Output

  输出最小费用

Sample Input

5 4
3
4
2
1
4

Sample Output

1

HINT

Source

Solution

  设$f[i]$表示前$i$个物品装箱所需最小花费。

  假设我们把$[j+1,i]$的物品装到一个箱子里,那么很容易得出dp方程:

  $f[i]=min\{f[j]+(i-j+(\sum_{k=j+1}^{i}c[k])-L)^{2}\}$

  现在要把这个$O(n^{2})$优化成$O(n)$:

  设$d[i]=d[i-1]+c[i]+1$,$P=L+1$,那么

  $f[i]=min\{f[j]+(d[i]-d[j]-P)^{2}\}$

  假设k<j<i,且j比k优,则:

  $f[j]+(d[i]-d[j]-P)^{2}<f[k]+(d[i]-d[k]-P)^{2}$

  化简后的结果是:

  $\frac{(f[j]+d[j]^{2})-(f[k]+d[k]^{2})}{d[j]-d[k]}<2*(d[i]-P)$

  将$f[j]+d[j]^{2}$看成$y_{j}$,将$d[j]$看成$x_{j}$,就变成了斜率的表达式。

  维护一个下凸壳($min$就是下凸壳,$max$就是上凸壳),找凸包上关于斜率$2*(d[i]-P)$的切点,该店就是决策点。

  说右凸壳的都给我狗带!狗带!!!

  由于满足决策单调性,所以决策$j$是单调不下降的,我们可以把多余的斜率删掉。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 long long f[50005], c[50005];
 4 int q[50005];
 5  
 6 double pow(long long x)
 7 {
 8     return 1.0 * x * x;
 9 }
10  
11 double slope(int x)
12 {
13     return (f[q[x]] + pow(c[q[x]]) - f[q[x - 1]] - pow(c[q[x - 1]])) / (c[q[x]] - c[q[x - 1]]);
14 }
15  
16 int main()
17 {
18     int n, l, front = 0, back;
19     cin >> n >> l;
20     for(int i = 1; i <= n; ++i)
21     {
22         cin >> c[i];
23         c[i] += c[i - 1] + 1;
24     }
25     ++l;
26     q[back = 1] = 0;
27     for(int i = 1; i <= n; ++i)
28     {
29         while(front + 1 < back && slope(front + 2) <= 2 * (c[i] - l))
30             ++front;
31         int j = q[front + 1];
32         f[i] = f[j] + (long long)pow(c[i] - c[j] - l);
33         q[++back] = i;
34         while(front + 1 < back && slope(back - 1) >= slope(back))
35             q[--back] = i;
36     }
37     cout << f[n] << endl;
38     return 0;
39 }
View Code

转载于:https://www.cnblogs.com/CtrlCV/p/5530481.html

相关文章:

  • scapy-协议数据组织结构与细节
  • 测试
  • Asp.net MVC 3实例学习之ExtShop(三)——完成首页
  • delphi 中COPY()函数的意思
  • 如何检查oracle的高可用性属性
  • one-to-many many-to-one配置解释
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之93——BREW中的工具接口层...
  • 第二次冲刺阶段每日任务01
  • python基础整理笔记(三)
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之94——BREW中的应用单元测试方法...
  • 一张图说明CDN网络的原理
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之95——BREW中的典型上有测试TBT...
  • 我的程序库:HiCSUtil
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之96——BREW中运营商管理的测试UBT...
  • echarts学习网站
  • 深入了解以太坊
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • ECMAScript入门(七)--Module语法
  • gf框架之分页模块(五) - 自定义分页
  • HTTP请求重发
  • HTTP--网络协议分层,http历史(二)
  • Java Agent 学习笔记
  • Java编程基础24——递归练习
  • laravel5.5 视图共享数据
  • Mac转Windows的拯救指南
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React as a UI Runtime(五、列表)
  • 彻底搞懂浏览器Event-loop
  • 电商搜索引擎的架构设计和性能优化
  • 关于for循环的简单归纳
  • 关于Java中分层中遇到的一些问题
  • 回顾2016
  • 将 Measurements 和 Units 应用到物理学
  • 解析 Webpack中import、require、按需加载的执行过程
  • 每天10道Java面试题,跟我走,offer有!
  • 前言-如何学习区块链
  • 手写一个CommonJS打包工具(一)
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 责任链模式的两种实现
  • 通过调用文摘列表API获取文摘
  • #{}和${}的区别是什么 -- java面试
  • #WEB前端(HTML属性)
  • #单片机(TB6600驱动42步进电机)
  • (2015)JS ES6 必知的十个 特性
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十) 初识 Docker file
  • (一)kafka实战——kafka源码编译启动
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)LINQ之路
  • (转)Linux整合apache和tomcat构建Web服务器