[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... ...
随机推荐
- Python迭代器与格式化
三元运算 对if-else判断的简写 >>> age = 18 >>> res = "You are so young!" if age < ...
- python的循环和选择
一.python的选择结构: python的选择结构有两种选择结构一种是单选择(if...else)另一种则是多选择结构(if ...elif...elif) 下面用代码来实现: 1.if....el ...
- ModelAttribute用法之一
@ModelAttribute也可以做为Model输出到View时使用,比如: 测试例子 package com.my.controller; import java.util.ArrayList ...
- Java对象的创建、内存布局和访问定位
在Java运行时数据区中,我们知道了虚拟机内存的概况,本文介绍虚拟机内存中的数据的其它细节,如对象如何创建.如何布局以及如何访问. 基于实用的原则,这里以HotSpot虚拟机和常用的内存区域Java堆 ...
- 利用php查看某个服务的进程数
查看进程就是使用ps命令而已,只不顾ps的参数太多了. 使用php查询的话,必须要开启几个函数(可以执行外部程序的函数),参考官网:http://php.net/manual/zh/book.exec ...
- js上传视频(jquery.form.js)
// 上传目标触发点 <input type="file" class="upvideo" name="upvideo" id=&qu ...
- spring AOP源码分析(二)
现在,我们将对代理对象的生成过程进行分析. 在springAOP源码分析(一)的例子中,将会生成哪些对象呢? 可以看到将会生成六个对象,对应的beanName分别是: userDao:目标对象 log ...
- Setting property 'source' to 'org.eclipse.jst.jee.server:hczm' did not find a matching property
- k8s使用glusterfs做存储
一.安装glusterfs https://www.cnblogs.com/zhangb8042/p/7801181.html 环境介绍; centos 7 [root@k8s-m ~]# cat / ...
- react事件绑定,事件传参,input单向数据绑定
import React, { Component } from 'react'; class New extends Component { constructor(props){ super(pr ...