玩具装箱

luogu 3195

题目大意

有n件物品,每件物品有相对的长度CiC_iCi​现在要把这n件物品放到容器中,切放的物品必须是连续的,若把第i件物品到第j件物品放到一个容器中,那此容器的长度定义为x=j−i+∑k=ijCix=j−i+\sum_{k=i}^{j} C_ix=j−i+∑k=ij​Ci​,此容器的费用即为(x−L)2(x-L)^2(x−L)2(L是常数),现在问你把所有物品放倒容器中,费用之和最小是多少

输入样例

5 4
3
4
2
1
4

输出样例

1

数据范围

对于全部的测试点,1≤n≤5×1041 \leq n \leq 5 \times 10^41≤n≤5×104,1≤L≤1071 \leq L \leq 10^71≤L≤107,1≤Ci≤1071 \leq C_i \leq 10^71≤Ci​≤107。

解题思路

我们设f[i]为把1至i的所有物品放进容器中的最小费用,那我们可以得出转移方程:
fi=fj+(i−(j+1)+sumi−sumj−L)2f_i=f_j+(i-(j+1)+sum_i-sum_j-L)^2fi​=fj​+(i−(j+1)+sumi​−sumj​−L)2
注:sum是C的前缀和,这个范围是j+1到i所以减的是j+1,前缀和减的是sum[(j+1)-1]
但是会超时间,所以我们要考虑优化
我们可以变式为:
fi=fj+((i+sumi−1−L)−(j+sumj))2f_i=f_j+((i+sum_i-1-L)-(j+sum_j))^2fi​=fj​+((i+sumi​−1−L)−(j+sumj​))2
然后把平方拆开,得到:
fi=fj+(i+sumi−1−L)2−2∗(i+sumi−1−L)∗(j+sumj)+(j+sumj)2f_i=f_j+(i+sum_i-1-L)^2-2*(i+sum_i-1-L)*(j+sum_j)+(j+sum_j)^2fi​=fj​+(i+sumi​−1−L)2−2∗(i+sumi​−1−L)∗(j+sumj​)+(j+sumj​)2
若有决策点a,b满足a>b且a比b优

fa+(i+sumi−1−L)2−2∗(i+sumi−1−L)∗(a+suma)+(a+suma)2<fj+(i+sumi−1−L)2−2∗(i+sumi−1−L)∗(b+sumb)+(b+sumb)2f_a+(i+sum_i-1-L)^2-2*(i+sum_i-1-L)*(a+sum_a)+(a+sum_a)^2<f_j+(i+sum_i-1-L)^2-2*(i+sum_i-1-L)*(b+sum_b)+(b+sum_b)^2fa​+(i+sumi​−1−L)2−2∗(i+sumi​−1−L)∗(a+suma​)+(a+suma​)2<fj​+(i+sumi​−1−L)2−2∗(i+sumi​−1−L)∗(b+sumb​)+(b+sumb​)2
变式
fa−2∗(i+sumi−1−L)∗(a+suma)+(a+suma)2<fj−2∗(i+sumi−1−L)∗(b+sumb)+(b+sumb)2f_a-2*(i+sum_i-1-L)*(a+sum_a)+(a+sum_a)^2<f_j-2*(i+sum_i-1-L)*(b+sum_b)+(b+sum_b)^2fa​−2∗(i+sumi​−1−L)∗(a+suma​)+(a+suma​)2<fj​−2∗(i+sumi​−1−L)∗(b+sumb​)+(b+sumb​)2
(fa+(a+suma)2)−(fb+(b+sumb)2)<2∗(i+sumi−1−L)∗((a+suma)−(b+sumb))(f_a+(a+sum_a)^2) - (f_b+(b+sum_b)^2)<2*(i+sum_i-1-L)*((a+sum_a)-(b+sum_b))(fa​+(a+suma​)2)−(fb​+(b+sumb​)2)<2∗(i+sumi​−1−L)∗((a+suma​)−(b+sumb​))
((fa+(a+suma)2)−(fb+(b+sumb)2))/((a+suma)−(b+sumb))<2∗(i+sumi−1−L)((f_a+(a+sum_a)^2) - (f_b+(b+sum_b)^2))/((a+sum_a)-(b+sum_b))<2*(i+sum_i-1-L)((fa​+(a+suma​)2)−(fb​+(b+sumb​)2))/((a+suma​)−(b+sumb​))<2∗(i+sumi​−1−L)

xi=i+sumix_i=i+sum_ixi​=i+sumi​
yi=fi+(i+sumi)2y_i=f_i+(i+sum_i)^2yi​=fi​+(i+sumi​)2

(ya−yb)/(xa−xb)<2∗(i+sumi−1−L)(y_a - y_b)/(x_a-x_b)< 2*(i+sum_i-1-L)(ya​−yb​)/(xa​−xb​)<2∗(i+sumi​−1−L)
带入模板即可

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll n, L, l, r, a[50010], sum[50010], x[50010], y[50010], q[50010], f[50010];
int main()
{scanf("%lld %lld", &n, &L);for (ll i = 1; i <= n; ++i){scanf("%lld", &a[i]);sum[i] = sum[i - 1] + a[i];x[i] = sum[i] + i;}memset(f, 127/3, sizeof(f));f[0] = 0;q[1] = 0;l = 1;r = 1;for (ll i = 1; i <= n; ++i){while(l < r && (y[q[l + 1]] - y[q[l]]) <= 2 * (x[i] - 1 - L) * (x[q[l + 1]] - x[q[l]]))l++;//模板f[i] = f[q[l]] + (x[i] - x[q[l]] - 1 - L) * (x[i] - x[q[l]] - 1 - L);y[i] = f[i] + x[i] * x[i];while(l < r && (y[q[r]] - y[q[r - 1]]) * (x[i] - x[q[r]]) >= (y[i] - y[q[r]]) * (x[q[r]] - x[q[r - 1]])) r--;q[++r] = i;}printf("%lld", f[n]);return 0;
}

【斜率优化】玩具装箱(luogu 3195)相关推荐

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

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

  2. 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)

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

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

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

  4. P3195-[HNOI2008]玩具装箱【斜率优化dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P3195 题目大意 nnn个物品,分成若干段,每一段的长度为j−i+∑i=lrCkj-i+\sum_{i=l}^rC ...

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

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

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

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

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

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

  8. BZOJ-1010 玩具装箱toy (斜率优化)

    题目大意:将n个数分成若干组,并且每组的数在原数组中应是连续的,每组会产生的代价为sum(i)-sum(j)+i-j-1-m,m为已知的常数.求最小代价. 题目分析:定义dp(i)表示将前 i 个元素 ...

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

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

最新文章

  1. 基于 Prometheus、InfluxDB 与 Grafana 打造监控平台
  2. django-pagination---七步教你实现Django网站列表自动分页
  3. 世纪前线网络质量测试工具 是什么_成为一名软件测试工程师有什么前途?
  4. 进程和线程(通信方式)、调度算法(6种)
  5. 聊一聊如何在.NET Core中使用Nacos 2.0
  6. Collectors.averagingLong()
  7. 查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件)...
  8. mysql操作--json/数组 的增删该查
  9. windows_正确修改windows用户名(win10/win11)实践/副作用说明
  10. 智伴机器人三级分销模式_微信三级分销模式的可行性?
  11. win7 计算机名IPDNS修改,怎样改ip地址_怎样更换电脑ip地址-win7之家
  12. cpplint中filter参数的每个可选项的含义
  13. Win10系统常见问题
  14. 固态硬盘能提高服务器内存吗,内存涨疯了!固态硬盘能替代内存吗?
  15. libevent库bufferevent事件实现socket通信
  16. Windows 2003 下 SquirrelMail 的安装
  17. Java乘船_船 - Minecraft Wiki,最详细的官方我的世界百科
  18. 网工必备网络排错管理工具之IP_MAC地址工具
  19. 【数字信号处理】 Unfolding(展开技术)
  20. 人机协作机器人发展趋势_人机协作渐成趋势,行业竞争日趋激烈

热门文章

  1. 怎么删除mysql的所有文件内容_mysql删除全部数据库
  2. python面向对象编程思想书籍_Python的面向对象编程思想
  3. 上海市二级c语言软件环境,上海市计算机二级C语言复习资料 word整理版.doc
  4. vector的逆序输出(神奇的vector)
  5. [SpringBoot2]welcomefavicon
  6. [SpringBoot2]自动配置
  7. [JavaWeb-MySQL]多表查询概述
  8. [蓝桥杯2016决赛]一步之遥-枚举
  9. springboot 历史版本文档_乘风破浪,SpringBoot入门
  10. python二分法求方程的根_Python查找函数f(x)=0根的解决方法