[HNOI2008]玩具装箱TOY(斜率优化)
题目链接
题意:有编号为\(1\cdots N\)的N件玩具,第 i 件玩具经过压缩后变成一维长度为 \(C_i\) 。要求在一个容器中的玩具编号是连续的,同时如果将第 i 件玩具到第 j 个玩具放到一个容器中,那么容器的长度将为 \(x=j-i+\sum\limits_{k=i}^{j}C_k\)。如果容器长度为 x ,其制作费用为 \((X-L)^2\) .其中 L 是一个常量。容器数目长度不限。求最小费用。
\(1 \le N \le 50000,1 \le L,Ci \le 10^7\)
这道题是斜率优化的经典题了qvq
当然dp顺序肯定是从前到后了
分析一下答案式
用f(j)来更新f(i)
\]
设\(a[i] = sum[i] + i, b[i] = sum[i] + i + 1 + L\)
\]
这里面 随j改变的量是\(b[j], b[j]^2\)和\(f[j]\)
所以移项得 \(2⋅a[i]⋅b[j]+f[i]−a[i]^2=f[j]+b[j]^2\)
将b[j]看作x,\(f[j]+b[j]^2\)看作y,这个式子就可以看作一条斜率为\(2a[i]\)的直线
f[i]即当上述直线过点\(P(b[j],f[j]+b[j]^2)\)时,直线在y轴的截距加\(a[i]^2\)
而题目即为找这个截距的最小值
由于sum[i]随i递增 所以a[i],b[i]都递增
所以点\(1 \cdots i-1\)是从左到右排列的
用单调栈维护一下凸包
像做线性规划一样做一个切线就行了
也就是二分斜率\((P_j,P_{j+1}) < 2a[i]\)
update:貌似不用二分
因为a[i]递增要查询的斜率也递增
那单调队列维护就行了qvq
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1e5 + 5;
const int K = 2e5;
int n, L;
double sum[N], f[N];
int que[N], head, tail;
inline double a(int x){return sum[x]+x;}
inline double b(int x){return sum[x]+x+1+L;}
inline double X(int x){return b(x);}
inline double Y(int x){return f[x]+b(x)*b(x);}//注意这里不可以用define qvq
//a[i] = sum[i] + i, b[i] = sum[i] + i + 1 + L
//P(b[j],f[j]+b[j]^2)
inline double slope(int x, int y){
return (Y(y) - Y(x)) / (X(y) - X(x));
}
int main() {
scanf("%d%d", &n, &L);
for(int i = 1; i <= n; ++i){
scanf("%lf", &sum[i]);
sum[i] += sum[i - 1];
}
head = tail = 1;
for(int i = 1; i <= n; ++i){
while(head < tail && slope(que[head], que[head + 1]) < 2 * a(i)) ++head;
f[i] = f[que[head]] + (a(i) - b(que[head])) * (a(i) - b(que[head]));
//printf("b %lld\n", (long long)(a(i) - b(que[head])));
while(head < tail && slope(que[tail - 1], que[tail]) > slope(que[tail - 1], i)) --tail;
que[++tail] = i;
}
printf("%lld", (long long)f[n]);
return 0;
}
[HNOI2008]玩具装箱TOY(斜率优化)的更多相关文章
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 11893 Solved: 5061[Submit][S ...
- Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定 ...
- 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- [luogu3195 HNOI2008] 玩具装箱TOY (斜率优化dp)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- P3195 [HNOI2008]玩具装箱TOY 斜率优化dp
传送门:https://www.luogu.org/problem/P3195 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP
题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...
- bzoj1010: [HNOI2008]玩具装箱toy——斜率优化
方程 $\Large f(i)=min(f(j)+(s(i)-s(j)-1-L)^2)$ 其中$s(i)$为i的前缀和再加上$i$ 对于某个$i$若$j$比$k$优,则 $\large f(j)+(s ...
- [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
随机推荐
- net core 小坑杂记之配置文件读取 02 (控制器里读)
上次更新博客的时候提到了如何在EF的上下文里读取配置,这次介绍一下在控制器里如何读取. 先说一种简单易懂的: 首先以键值对的形式在appsettings里添加一条配置信息,接着Startup里注入配置 ...
- 分析一个react项目
目录结构 下面是使用npx create-react-app web-app来创建的一个项目(已经删除了多余的文件) web-app ├── node_modules │ ├── ....... ...
- asp.net core下一个简单的分页技术
在做web应用的时候免不了要对数据进行分页,我最近在做asp.net core的开发的时候就遇到了这个需求,现在简单的记录一下: public class PaginatedList<T> ...
- 简单理解laravel框架中的服务容器,服务提供者以及怎样调用服务
laravel被称为最优雅的框架,最近正在学习中,对于用惯了thinkphp.ci框架的人来说,服务容器.服务提供者,依赖注入这些概念简直是一脸懵逼.我花了些时间梳理了一下,也不敢确定自己说的是对 ...
- PL/SQL编程--变量声明及赋值
declare v_price ,);--单价 v_usenum number;--水费字数 v_usenum2 number;--使用吨数 begin v_price:=2.45;--每吨单价 v_ ...
- .Net在操作mysql查询的时候出现“: Unknown column 'UserName' in 'where clause'”错误
今天使用.Net操作mysql查询的时候,如果加上条件查询的时候就会出现 Unknown column 'UserName' in 'where clause'这个错,不加条件直接select * f ...
- 2.请介绍一下List和ArrayList的区别,ArrayList和HashSet区别
第一问: List是接口,ArrayList实现了List接口. 第二问: ArrayList实现了List接口,HashSet实现了Set接口,List和Set都是继承Collection接口. A ...
- python之路--管道, 事件, 信号量, 进程池
一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...
- Airflow 使用随笔(内含 TimeZone 和 Backfill 等的详解)
其实怎么部署 airflow 又哪些特性,然后功能又是如何全面都可以在 Reference 的文章里面找到,都不是重点这里就不赘述了. 这里重点谈一下我在部署完成仔细阅读文档之后觉得可以总结的一些东 ...
- python函数、模块、包
一.函数 定义函数: def fun_name(para_list): coding def fun_name(para_list): coding return xxx 使用函数,fun_name( ...