【APIO2010T1】特别行动队-DP斜率优化
来源:互联网 发布:淘宝怎么贷款最高额度 编辑:程序博客网 时间:2024/05/21 15:38
测试地址:特别行动队
做法:这题需要用到DP斜率优化。
设f[i]为拆分前i个士兵可获得的最大战斗力,sum[i]为前i个士兵的初始战斗力之和,很容易得到O(N^2)的方程:
f[i]=max{f[j]+a(sum[i]-sum[j])^2+b(sum[i]-sum[j])+c}(0≤j<i)
然而N可达1000000,我们需要考虑优化。
我们把max内部的式子展开得:f[j]+a*sum[i]^2-2*a*sum[i]*sum[j]+a*sum[j]^2+b*sum[i]-b*sum[j]+c,把a*sum[i]^2+b*sum[i]+c这些无关项从max中取出来,则剩下的式子G=-2*a*sum[i]*sum[j]+f[j]+a*sum[j]^2-b*sum[j],令k=2*a*sum[i],x=sum[j],y=f[j]+a*sum[j]^2-b*sum[j],则G=-kx+y,所以y=kx+G。要求G的最大值,就是求一条斜率为k的直线与前面状态点上凸壳的切点。由于sum单调递增,a是负数,所以x单调递增,k单调递减,所以可以用单调队列维护上凸壳,复杂度优化到O(N),完美解决该问题。
以下是本人代码:
#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,h,t,q[1000010];long long a,b,c,sum[1000010],f[1000010];struct point{ long long x,y; point operator - (point a) const { point s;s.x=x-a.x;s.y=y-a.y;return s; }}p[1000010];long long multi(point a,point b){ return a.x*b.y-b.x*a.y;}void solve(){ h=1,t=1; q[1]=0;p[0].x=p[0].y=0; for(int i=1;i<=n;i++) { point now;now.x=1,now.y=2*a*sum[i]; while(h<t&&multi(now,p[q[h+1]]-p[q[h]])>=0) h++;int j=q[h];f[i]=f[j]+a*(sum[i]-sum[j])*(sum[i]-sum[j])+b*(sum[i]-sum[j])+c;p[i].x=sum[i],p[i].y=f[i]+a*sum[i]*sum[i]-b*sum[i];while(h<t&&multi(p[i]-p[q[t-1]],p[q[t]]-p[q[t-1]])<=0) t--;q[++t]=i; }}int main(){ scanf("%d",&n); scanf("%lld%lld%lld",&a,&b,&c); sum[0]=0; for(int i=1;i<=n;i++) { long long a;scanf("%lld",&a);sum[i]=sum[i-1]+a; } solve(); printf("%lld",f[n]); return 0;}
0 0
- 【APIO2010T1】特别行动队-DP斜率优化
- 【斜率优化DP】特别行动队
- 【APIO2010】【斜率优化DP】特别行动队
- 【bzoj1911】特别行动队 斜率优化dp
- 【斜率优化】特别行动队
- [apio2010]特别行动队(斜率优化的dp)
- bzoj1911: [Apio2010]特别行动队 斜率优化DP
- BZOJ 1911 APIO 2010 特别行动队 斜率优化DP
- BZOJ 1911 特别行动队(斜率优化dp)
- bzoj 1911 [Apio2010]特别行动队斜率优化+DP
- [BZOJ1911]APIO2010特别行动队|斜率优化DP
- [APIO2010]特别行动队(斜率优化dp)
- 【bzoj1911】[Apio2010]特别行动队 DP斜率优化
- 【BZOJ1911】【codevs1318】特别行动队,斜率优化DP
- [BZOJ1911][Apio2010]特别行动队(斜率优化dp)
- 【bzoj 1911】 [Apio2010]特别行动队(斜率优化dp)
- bzoj 1911 [Apio2010]特别行动队(斜率优化+DP)
- [BZOJ 1911][Apio2010]特别行动队:DP斜率优化
- 基于模型开发过程之变量篇——枚举量…
- 人生没有过不去的坎
- windows下react-native环境配置
- reactNative中的通知
- 2017年个人目标及计划
- 【APIO2010T1】特别行动队-DP斜率优化
- 阿里用技术帮用户剁手——《尽在双11——阿里巴巴技术演进与超越》
- SDUT 3258 Square Number【思维+高效预处理】
- 短信验证-互亿短信
- oracle存储过程基本使用
- 【SQL之查询】MySQL查询今天、昨天、上周、近30天、去年等的数据的方法
- 二叉树14:把二叉树打印成多行
- HDU5334(构造,思维)
- spring整合redis(集群、主从)