博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化
阅读量:4321 次
发布时间:2019-06-06

本文共 1747 字,大约阅读时间需要 5 分钟。

复习一下斜率优化:
令 $f_{i}$ 表示从 1 考虑到 $i$ 的最优结果.
得 $f_{i}=min${ $f_{j}+(sum_{i}-sum_{j}+i-j-1-L)^{2}$}
如果直接枚举,是 $O(n^{2})$ 的,太慢了!!!
考虑斜率优化:
令 $k<j$,考虑什么时候 $j$ 比 $k$ 优:
$fj​+(sumi​−sumj​+i−j−1−L)^{2}<fk​+(sumi​−sumk​+i−k−1−L)^{2}$
令 $a_{i}=sum_{i}+i$ ,$b_{i}=sum_{i}+i+1+L$ (为了简化计算)
得: $f_{j}+(a_{i}-b_{j})^{2}<f_{k}+(a_{i}-b_{k})^{2}$
化简一下,得:$\frac{f_{j}+b_{j}^{2}-(f_{k}+b_{k}^{2})}{b_{j}-b_{k}}<2\times a_{i}$
令 $g[x]=f_{x}+b_{x}^{2}$
上面式子为 $\frac{g_{j}-g_{k}}{b_{j}-b{k}}$,看上去是不是很熟悉 ?
这不就是一次函数斜率得形式嘛......
可以把 $j,k$ 都看作二维平面上的点 $(b_{j},g_{j})$ 与 $(b_{k},g_{k})$
那么, $j$ 的答案优于 $k$ 是在二者得斜率小于 $2\times a_{i}$ 的情况下成立的.
所以说,我们要求的 $j$ 就是编号最大的与前一个点的斜率小于 $2a_{i}$ 的值. 
手画一下,发现这道题中我们要维护的其实就是一个下凸包.
根据我们每一次的斜率 $2\times a_{i}$,不难发现这个东西是单调递增的,所以当我们找到答案 $tmp$ 时,$tmp$ 前的所有点就都变成无用点,直接弹掉即可.
而每一次新加入一个点,就顺便维护凸包的形状,将不合法的点从队尾弹出即可.     
#include
#include
using namespace std;const int maxn = 100000 + 123;long long s[maxn], f[maxn];int l, n, q[maxn];inline long long re_x(int i){ return s[i]; }inline long long re_y(int i){ return f[i] + (s[i] + l) * (s[i] + l); }inline double get_slope(int i,int j){return (double)(re_y(i) - re_y(j)) / (re_x(i) - re_x(j)); }int main(){ scanf("%d%d",&n,&l); for(int i = 1;i <= n; ++i) scanf("%lld",&s[i]), s[i] += s[i-1]; for(int i = 1;i <= n; ++i) s[i] += i; int head = 0, tail = 0; for(int i = 1;i <= n; ++i) { while(head < tail && get_slope(q[head], q[head + 1]) < 2 * s[i] ) ++ head; f[i] = f[q[head]] + (s[i] - s[q[head]] - 1 - l) * (s[i] - s[q[head]] - 1 - l); while(tail > head && get_slope(q[tail], i) < get_slope(i, q[tail - 1])) --tail; q[++tail] = i; } printf("%lld",f[n]); return 0;}

  

转载于:https://www.cnblogs.com/guangheli/p/9845169.html

你可能感兴趣的文章
mysql命令行编辑模式
查看>>
《实践与思考》系列连载(6)——IT从业人员工作环境及状态调查 抽奖结果公布...
查看>>
hihocoder 1643 Puzzle Game(北京icpc2017 现场赛)
查看>>
vim 简单理解三种模式 粗暴入门
查看>>
django模板层之静态文件引入优化
查看>>
转载使用命令wsimport构建WebService客户端
查看>>
java实现23种设计模式之模版方法模式
查看>>
小程序·云开发实战 - 校园约拍小程序
查看>>
闲话函数式变成与OOP
查看>>
Linux-正则表达式与三剑客
查看>>
php中,post与get获取参数的异同
查看>>
警惕!年轻人要拥抱自动化和人工智能作为通信的未来
查看>>
Python给数字前固定位数加零
查看>>
python 多进程和多线程对比
查看>>
【转载】 wpf无边框的方法以及拖拽的问题
查看>>
Web自动化测试 二 ----- HTML
查看>>
sql 入门经典(第五版) Ryan Stephens 学习笔记  第四部分:建立复杂的数据库查询/...
查看>>
[原创]Keys的基本操作总结,判断Keys中是否存在Keys.Control|Keys.Alt,移除Keys中的部分键值。...
查看>>
主题样式之背景图片不随鼠标滑动而移动
查看>>
Centos 中文乱码
查看>>