cogs 1330 [HNOI2008]玩具装箱toy
cogs 1330 [HNOI2008]玩具装箱toy
瞎扯,急忙AC的请跳过
感觉数据结构写的太多了有点晕=+
发现还没学斜率优化+-
于是来学一学QwQ
上次这题打了个决策优化直接水过了。。理论O(n^2)
蒯个链接
来推一推~
设f[i]为搞定区间1~i的答案。
推出转移方程:
\]
其中\(s_i\)为\(\sum_{j=1}^{i}C_j\)
这里优化一下:\(s_i\)表示\(i+\sum_{j=1}^{i}C_j\),转移方程简化为
\]
其实没那个必要优化,只是看着爽
然后,\(s_i-1-L\)只和\(i\)有关,\(-s_j\)只和j有关。一次转移中\(i\)是不会变的,\(s_i-1-L\)也是不会变的。
令\(X=s_i-1-L\).
\(f[i]=min(f[j]+(X-s_j)^2)\)
\(\ \ \ \ \ \ =min(f[j]+X^2+s_j^2-2Xs_j)\)
那个\(X^2\)与\(j\)毫无关联,完全可以提出来。
\(\ \ \ \ \ \ =min(f[j]+s_j^2-2Xs_j)+X^2\)
换一个角度:一个\(j\)会转移给不同的\(i\),转移过程中\(f[j]+s_j^2\)不会改变,改变的只有\(-2Xs_j\)
然后,由于\(X\)的不同,转移过去的值也不同。
这个值其实是个一次函数\(y=-2Xs_j+f[j]+s_j^2\).
把\(-2s_j\)看成\(k\),把\(f[j]+s_j^2\)看成\(b\).
画出笛卡尔平面直角坐标系。
(自行脑补,懒得画了)
有一些线是不需要的,因为x取什么值,它都取不到最小,可以删除
然后维护一个单调队列放所有的线
可以发现\(k\)单调递减,\(x\)单调递增,所以很好维护,如果队首答案>队首+1答案直接hd++,懒得证。
怎么维护真的懒得写了。。。下凸壳的左半部分
然后直接上代码吧?
感觉是最详细的一篇博客了
// It is made by XZZ
#include<cstdio>
#include<algorithm>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
#define db double
typedef long long ll;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=50001;
ll s[maxn],f[maxn];
struct line{ll k,b;};
struct point{db x,y;};
il point javascript(const line&a,const line&b){
static point ret;
ret.x=(a.b-b.b)/(db)(a.k-b.k);
ret.y=ret.x*a.k+a.b;
return ret;
}
line que[maxn];int hd,tl;
int main(){
int n=gi();ll l=gi();
rep(i,1,n)s[i]=gi()+s[i-1];
rep(i,1,n)s[i]+=i;
f[0]=0;
hd=0,tl=-1;
que[++tl]=(line){0,0};
rep(i,1,n){
static ll x;x=s[i]-l-1;
while((tl^hd)&&que[hd].k*x+que[hd].b>que[hd+1].k*x+que[hd+1].b)++hd;
f[i]=que[hd].k*x+que[hd].b+x*x;
static line ls;ls=(line){-2*s[i],f[i]+s[i]*s[i]};
while((tl^hd)&&javascript(ls,que[tl]).x>javascript(ls,que[tl-1]).x)--tl;
que[++tl]=ls;
}
printf("%lld\n",f[n]);
return 0;
}
cogs 1330 [HNOI2008]玩具装箱toy的更多相关文章
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...
- 【bzoj1010】[HNOI2008]玩具装箱toy
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9281 Solved: 3719[Submit][St ...
- 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9330 Solved: 3739 Descriptio ...
- bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7874 Solved: 3047[Submit][St ...
- BZOJ 1010 [HNOI2008]玩具装箱toy
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7184 Solved: 2724[Submit][St ...
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 11893 Solved: 5061[Submit][S ...
- P3195 [HNOI2008]玩具装箱TOY(斜率优化dp)
P3195 [HNOI2008]玩具装箱TOY 设前缀和为$s[i]$ 那么显然可以得出方程 $f[i]=f[j]+(s[i]-s[j]+i-j-L-1)^{2}$ 换下顺序 $f[i]=f[j]+( ...
- [luogu P3195] [HNOI2008]玩具装箱TOY
[luogu P3195] [HNOI2008]玩具装箱TOY 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆, ...
随机推荐
- 卸载oracle 10g
1.开始->设置->控制面板->管理工具->服务——> 停止所有Oracle服务.(没有起动的就不用停用了)2.开始->程序->Oracle - OraD ...
- 使用UISearchDisplayController
使用UISearchDisplayController 虽然UISearchDisplayController名字中带有controller,可他不是一个UIView相关的controller,因为, ...
- Oracle Order By 排序 非主键时 紊乱 重复 问题
Oracle的分页查询是没有进行任何排序操作的,Oracle是顺序的从数据块中读取符合条件的数据返回到客户端. 而Oracle的排序算法不具有稳定性,也就是说,对于排序键值相等的数据,这种算法完成排序 ...
- 一个好玩的计算题目(c++ 位运算)
2015/11/10 在一个qq群里面,看到一个好玩的题目.“int foo(int x){return x&-x} foo(2^31-3)这个怎么算 ?” 1.自己也就开始算了: (1) ...
- windows 下安装nodejs 要怎么设置环境变量
windows 下安装nodejs 了,也安装了npm, 但是有时候切不能直接用request(‘ws’)这一类的东西.我觉得是确实环境变量或其他设置有问题,能否给个完整的设置方案: 要设置两个东西, ...
- 第二次项目冲刺(Beta版本) 合集
小组成员 [组长]金盛昌(201421122043).刘文钊(20142112255).陈笑林(201421122042) 张俊逸(201421122044).陈志建(201421122040).陈金 ...
- Git Hooks、GitLab CI持续集成以及使用Jenkins实现自动化任务
Git Hooks.GitLab CI持续集成以及使用Jenkins实现自动化任务 前言 在一个共享项目(或者说多人协同开发的项目)的开发过程中,为有效确保团队成员编码风格的统一,确保部署方式的统一, ...
- selenium安装浏览器驱动
3.0以上版本恩的selenium需要安装驱动 pip show selenium 安装驱动 1.下载驱动地址: 火狐:https://github.com/mozilla/geckodriver/r ...
- Geeks : Kruskal’s Minimum Spanning Tree Algorithm 最小生成树
版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...
- SAP NetWeaver BPM
什么是BPM? BPM是Business Process Management的缩写,翻译过来是业务流程管理.BPM本身并没有明确的定义,它更多的是一种概念,这个概念本身的产生来源于企业对众多业务系统 ...