[HNOI2008]玩具装箱TOY

13 篇文章 1 订阅
题目描述

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

P 教授有编号为 1 ⋯ n 1 \cdots n 1n n n n 件玩具,第 i i i 件玩具经过压缩后的一维长度为 C i C_i Ci

为了方便整理,P教授要求:

在一个一维容器中的玩具编号是连续的。

同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物。形式地说,如果将第 ii 件玩具到第 jj 个玩具放到一个容器中,那么容器的长度将为 x = j − i + ∑ k = i j C k x=j-i+\sum\limits_{k=i}^{j}C_k x=ji+k=ijCk

制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为 xx,其制作费用为 ( x − L ) 2 (x-L)^2 (xL)2 。其中 L L L 是一个常量。P 教授不关心容器的数目,他可以制作出任意长度的容器,甚至超过 L L L。但他希望所有容器的总费用最小。

输入格式

第一行有两个整数,用一个空格隔开,分别代表 n n n L L L

2 2 2 到 第 ( n + 1 ) (n + 1) (n+1) 行,每行一个整数,第 ( i + 1 ) (i + 1) (i+1) 行的整数代表第 i i i 件玩具的长度 C i C_i Ci

输出格式

输出一行一个整数,代表所有容器的总费用最小是多少。

输入输出样例
输入 #1

5 4
3
4
2
1
4

输出 #1

1

说明/提示

对于全部的测试点, 1 ≤ n ≤ 5 × 1 0 4 1 \leq n \leq 5 \times 10^4 1n5×104 1 ≤ L ≤ 1 0 7 1 \leq L \leq 10^7 1L107 1 ≤ C i ≤ 1 0 7 1 \leq C_i \leq 10^7 1Ci107

题解

这题有 O ( n ) O(n) O(n)的斜率优化方法

首先如果这题有 O ( n 2 ) O(n^2) O(n2)的部分分的话应该不难想到DP方程:
d p [ i ] = m i n { d p [ j ] + ( s u m [ i ] + i − s u m [ j ] − j − L − 1 ) 2 } dp[i]=min\{dp[j]+(sum[i]+i-sum[j]-j-L-1)^2\} dp[i]=min{dp[j]+(sum[i]+isum[j]jL1)2}

至于斜率优化,还是按老套路来,把 m i n min min去掉然后把关于 j j j的放在右边。。

由于方程中常数过多,直接设 a [ i ] = s u m [ i ] + i , b [ i ] = s u m [ i ] + i + L + 1 a[i]=sum[i]+i,b[i]=sum[i]+i+L+1 a[i]=sum[i]+i,b[i]=sum[i]+i+L+1

所以 2 ∗ a [ i ] ∗ b [ j ] + d p [ i ] − a [ i ] 2 = d p [ j ] + b [ j ] 2 2*a[i]*b[j]+dp[i]-a[i]^2=dp[j]+b[j]^2 2a[i]b[j]+dp[i]a[i]2=dp[j]+b[j]2

b [ j ] b[j] b[j] x x x d p [ j ] + b [ j ] 2 dp[j]+b[j]^2 dp[j]+b[j]2 y y y 2 ∗ a [ i ] 2*a[i] 2a[i]是斜率, d p [ i ] − a [ i ] 2 dp[i]-a[i]^2 dp[i]a[i]2是截距。

由于 a a a b b b数组都是单调的,所以直接双指针扫一遍即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值