【APIO2010】bzoj1911 特别行动队
来源:互联网 发布:linux文件分区 编辑:程序博客网 时间:2024/05/15 23:50
斜率优化dp。
容易写出dp[i]=max{dp[j]+a * (s[i]-s[j])^2+b * (s[i]-s[j])+c}
变形得到dp[j]+a * s[j]^2-b * s[j]=2 * a * s[i] * s[j]+dp[i]-b * s[i]-c
令y=dp[j]+a * s[j]^2-b * s[j]
k=2 * a * s[i]
b=dp[i]-b * s[i]-c
问题就变为给定直线的斜率和一些点,求使直线的截距最大的点。
因为斜率单调减小,所以用双端队列维护上凸壳,队头所有斜率大于当前斜率的之后再也不会用到,可以出队。队尾不满足上凸的也要弹出。
#include<cstdio>#include<cstring>#define LL long longLL dp[1000010],que[1000010],a[1000010],s[1000010];double f[1000010],g[1000010];double tj(int p,int q){ return (f[q]-f[p])/((double)s[q]-s[p]);}int main(){ int i,j,k,m,n,p,q,x,y,z,A,B,C,hd=1,tl=1; scanf("%d%d%d%d",&n,&A,&B,&C); for (i=1;i<=n;i++) { scanf("%lld",&a[i]); s[i]=s[i-1]+a[i]; g[i]=2*A*s[i]; } for (i=1;i<=n;i++) { while (hd<tl&&tj(que[hd],que[hd+1])>=g[i]) hd++; dp[i]=dp[que[hd]]+(LL)A*(s[i]-s[que[hd]])*(s[i]-s[que[hd]])+(LL)B*(s[i]-s[que[hd]])+(LL)C; f[i]=dp[i]+(LL)A*s[i]*s[i]-(LL)B*s[i]; while (hd<tl&&tj(que[tl-1],que[tl])<=tj(que[tl],i)) tl--; que[++tl]=i; } printf("%lld\n",dp[n]);}
0 0
- [Bzoj1911][Apio2010]特别行动队
- bzoj1911 [Apio2010]特别行动队
- APIO2010特别行动队bzoj1911
- [BZOJ1911][Apio2010]特别行动队
- [BZOJ1911] [Apio2010]特别行动队
- BZOJ1911: [Apio2010]特别行动队
- bzoj1911【APIO2010】特别行动队
- BZOJ1911 Apio2010 特别行动队
- bzoj1911[Apio2010] 特别行动队
- 【APIO2010】bzoj1911 特别行动队
- bzoj1911: [Apio2010]特别行动队
- bzoj1911: [Apio2010]特别行动队
- bzoj1911 [Apio2010]特别行动队
- 【BZOJ1911】【APIO2010】特别行动队
- BZOJ1911: [Apio2010]特别行动队
- 【bzoj1911】【APIO2010】【特别行动队】【斜率优化】
- 【bzoj1911】[Apio2010]特别行动队commando
- BZOJ1911 [Apio2010]特别行动队 斜率优化
- 个人记录-LeetCode 9.Palindrome Number
- 详细的介绍一下Unity5的AssetBundle
- 学习方法论---知其所以然(以算法学习为例)
- 04-树5 Root of AVL Tree (25分)
- 1613-3-傅溥衍 第一天总结
- 【APIO2010】bzoj1911 特别行动队
- 从今天开始,决定又开始学习后台
- 文本嗅探 字符串的题
- Shiro基础知识02----shiro身份验证(HelloWorld,Subject,Reaml(自定义reaml)),Authenticator及AuthenticationStrategy
- xml基础知识
- C# Windows-API-Code-Pack for .Net
- Ajax-XMLHttpRequest2
- Android热修复(Hot Fix)案例全剖析(一)
- dug使用方法