洛谷P3195 玩具装箱
第一道斜率优化题。
首先一个基本的状态转移方程是
要使f[i]最小,即b最小。
对于每个j,可以表示为一个点。
然后我们取固定斜率时截距最小的即可,高中线性规划。
单调队列维护下凸包。
然后每次二分出j,转移。
记得给(0,L * L)赋初值。
记得开long long
++,--最好别随便用,编译器的不同会让你爆0...
#include <cstdio> typedef long long LL;
const int N = ; LL sum[N], g[N], p[N], top;
LL f[N], y[N]; inline double slope(int i, int j) {
return ((double)(y[j] - y[i])) / (g[j] - g[i]);
} inline int get(int i) {
if(i == ) {
return ;
}
double k = 2.0 * g[i];
int l = , r = top, mid;
while(l < r) {
mid = (l + r) / ;
//printf("%lf %lf \n", slope(p[mid], p[mid + 1]), k);
if(slope(p[mid], p[mid + ]) < k) {
l = mid + ;
}
else {
r = mid;
}
}
//printf("i = %d r = %d j = %d \n", i, r, p[r]);
return p[r];
} int main() {
//freopen("in.in", "r", stdin);
LL n, L;
scanf("%lld%lld", &n, &L);
L++;
for(int i = ; i <= n; i++) {
LL x;
scanf("%lld", &x);
sum[i] = sum[i - ] + x;
g[i] = i + sum[i];
}
y[] = L * L;
for(int i = ; i <= n; i++) {
// f[i] = f[j] + (g[i] - g[j] - L) ^ 2
int j = get(i); f[i] = f[j] + (g[i] - g[j] - L) * (g[i] - g[j] - L);
y[i] = f[i] + (g[i] + L) * (g[i] + L);
//printf("y[%d] = %d \n", i, y[i]); p[++top] = i;
while(top > && slope(p[top - ], p[top - ]) >= slope(p[top - ], p[top])) {
p[top - ] = p[top];
top--;
}
} /*for(int i = 1; i <= n; i++) {
printf("%lld ", f[i]);
}
puts("");*/
printf("%lld", f[n]);
return ;
}
AC代码
[update20181208]今天又考了一次玩具装箱,发现了一个问题.......怎么能把点的坐标直接带入到斜截式里面啊!!!!
只知道y - y0 = k(x - x0),从来没听过y0 = kx0 + b啊啊啊!!!
关于上面那个的解释:(感谢某蒋姓巨佬为我讲解)
上面那个式子化简为2gi * gj + C = F(j)
考虑有某条直线过点(gj, F(j)),且方程为kx + b = y,其中k = 2gi
那么将点带入,可得:k * gj + b = F(j)
故上面那个等式即为直线的方程。
y - F(j) = 2gi(x - gj)
y - F(j) = 2gi * x - 2gi * gj
然后反正瞎搞一搞就行了啦我也不管了啊啊啊啊阿斜率优化好难啊啊我到底在写什么东西啊
洛谷P3195 玩具装箱的更多相关文章
- 洛谷P3195 玩具装箱TOY
题目大意: 有n个数,要将他们分成若干段,每一段的cost定义为: cost=r-l+ΣCk (k∈[r,l]) 该段的最终花费是:(cost-L)^2; 给出L,n,C(1~n),总共的最小花费. ...
- 洛谷P3195||bzoj1010 [HNOI2008]玩具装箱TOY
洛谷P3195 bzoj1010 设s数组为C的前缀和 首先$ans_i=min_{j<i}\{ans_j+(i-j-1+s_i-s_j-L)^2\}$ (斜率优化dp)参考(复读)https: ...
- 洛谷 P3195 [HNOI2008] 玩具装箱
链接: P3195 题意: 给出 \(n\) 个物品及其权值 \(c\),连续的物品可以放进一个容器,如果将 \(i\sim j\) 的物品放进一个容器,产生的费用是 \(\left(j-i+\sum ...
- 洛谷P3195 [HNOI2008] 玩具装箱 [DP,斜率优化,单调队列优化]
题目传送门 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP
题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- [洛谷P3195][HNOI2008]玩具装箱TOY
题目大意:有n个物体,大小为$c_i$.把第i个到第j个放到一起,容器的长度为$x=j-i+\sum\limits_{k-i}^{j} c_k$,若长度为x,费用为$(x-L)^2$.费用最小. 题解 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...
- 洛谷 P3195 [HNOI2008]玩具装箱TOY
题意简述 有n个物体,第i个长度为ci 将n个物体分为若干组,每组必须连续 如果把i到j的物品分到一组,则该组长度为 \( j - i + \sum\limits_{k = i}^{j}ck \) 求 ...
随机推荐
- .Net的EF+MVC框架使用T4生成各个层的代码的,在新增表的时候,调不到新增的实体
如果确认有这个实体的话,只需要把T4模板全部重新生成就可以了
- CRM/PLM/SCM/MES与ERP的联系与区别
企业通过专设信息机构.信息主管,配备适应现代企业管理运营要求的自动化.智能化.高技术硬件.软件.设备.设施,建立包括网络.数据库和各类信息管理系统在内的工作平台,提高企业经营管理效率的发展模式. 那么 ...
- Django项目目录介绍
一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...
- 在linux命令下访问url
1.elinks - lynx-like替代角色模式WWW的浏览器 例如: elinks --dump http://www.baidu.com 2.wget 这个会将访问的首页下载到本地 [root ...
- saltstack二
配置管理 haproxy的安装部署 haproxy各版本安装包下载路径https://www.haproxy.org/download/1.6/src/,跳转地址为http,改为https即可 创建相 ...
- 学习android开发之路(一)页面布局
Android页面布局 1.Android页面布局一共分为6种: LinearLayout(线性布局).RelativeLayout(相对布局).TableLayout(表格布局).FrameLayo ...
- 吴恩达deeplearning之CNN—卷积神经网络
https://blog.csdn.net/ice_actor/article/details/78648780 个人理解: 卷积计算的过程其实是将原始的全连接换成了卷积全连接,每个kernel为对应 ...
- linux读取Windows的txt文件问题
问题:Windows下生成的txt文件,在Linux下读取时会读取到多余字符(如: ^M) 原因:Windows和Linux下的换行符不一致 解决:在Linux代码中将多余字符去掉 ) buf = b ...
- 关于mysql 5.7 版本登录时出现错误 1045的随笔
之前学习的时候用的都是oracle 但是现在在工作中大部分用的都是mysql,所以自己也就装了个mysql,下载.安装教程都是从网上百度的,花了挺长时间才装好,心也是挺累的,教程挺多,就是不知道该用哪 ...
- Json.net 反序列化 部分对象
主要通过 Jobject获取想要序列化的部分对象. 直接上代码 static void Main(string[] args) { //先反序列化看看 string json = "{\&q ...