题目描述

  你有一支由n名预备役士兵组成的部队,士兵从1到n编号,要将他们拆分成若干特别行动队调入战场。出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,…,i+k)的序列。
  编号为i的士兵的初始战斗力为xi,一支特别运动队的初始战斗力x为队内士兵初始战斗力之和,即x=(xi)+(xi+1)+…+(xi+k)。
  通过长期的观察,你总结出一支特别行动队的初始战斗力x将按如下经验公式修正为x’:x’=ax^2+bx+c,其中a,b,c是已知的系数(a<0)。
  作为部队统帅,现在你要为这支部队进行编队,使得所有特别行动队修正后战斗力之和最大。试求出这个最大和。
  例如,你有4名士兵,x1=2,x2=2,x3=3,x4=4。经验公式中的参数为a=-1,b=10,c=-20。此时,最佳方案是将士兵组成3个特别行动队:第一队包含士兵1和士兵2,第二队包含士兵3,第三队包含士兵4。特别行动队的初始战斗力分别为4,3,4,修正后的战斗力分别为4,1,4。修正后的战斗力和为9,没有其它方案能使修正后的战斗力和更大。

输入格式

输入由三行组成。第一行包含一个整数n,表示士兵的总数。第二行包含三个整数a,b,c,经验公式中各项的系数。第三行包含n个用空格分隔的整数x1,x2,…,xn,分别表示编号为1,2,…,n的士兵的初始战斗力。

输出格式

输出一个整数,表示所有特别行动队修正战斗力之和的最大值。

样例数据

样例输入

4
-1 10 -20
2 2 3 4

样例输出

9

数据范围

20%的数据中,n<=1000;
50%的数据中,n<=10000;
100%的数据中,1<=n<=1000000,-5<=a<=-1,|b|<=10000000,|c|<=10000000,1<=xi<=100。

————————————————————————————

题解

sum[]为前缀和数组,dp[i]为选到第i个时的最大值。
dp[i]=max(dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c);
dp[i]=(dp[j]+a*sum[j]^2+b*sum[j]-2*sum[i]*sum[j])+a*sum[i]^2+b*sum[i]+c;设X(i)=sum[j];B(i)=f[i]-a*sum[i]*sum[i]-b*sum[i]-c;Y(i)=f[i]+a*sum[i]^2-b*sum[i]K(i)=2*a*sum[i]
原式可化为Y=KX+B的形式。之后用一个单调队列来维护即可。

代码

#include<bits/stdc++.h>
#define int long longusing namespace std;
const int MAXN = 1000005;int n,sum[MAXN];
int f[MAXN];
int Q[MAXN],head,tail;
int a,b,c;inline double B(int i){return f[i]-a*sum[i]*sum[i]-b*sum[i]-c;}
inline double K(int i){return 2*a*sum[i];}
inline double X(int i){return sum[i];}
inline double Y(int i){return f[i]+a*sum[i]*sum[i]-b*sum[i];}
inline double sp(int i,int j){return 1.0*(Y(i)-Y(j))/(X(i)-X(j));}signed main(){scanf("%lld",&n);scanf("%lld%lld%lld",&a,&b,&c);for(register int i=1;i<=n;i++){int x;scanf("%lld",&x);sum[i]=sum[i-1]+x;}   for(register int i=1;i<=n;i++){while(head<tail && sp(Q[head],Q[head+1])>K(i)) head++;f[i]=-(K(i)*X(Q[head])-Y(Q[head])-a*sum[i]*sum[i]-b*sum[i]-c);while(head<tail && sp(Q[tail-1],Q[tail])<=sp(Q[tail],i)) tail--;Q[++tail]=i;}printf("%lld",f[n]);return 0;
}

BZOJ 1911 (APIO 2010) 特别行动队相关推荐

  1. BZOJ 1911 特别行动队

    BZOJ 1911 特别行动队 裸的斜率优化,去年的APIO怎么有此等水题. //By YY_More #include<cstdio> struct point{long long x, ...

  2. bzoj 1911: [Apio2010]特别行动队 -- 斜率优化

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Description Input Output Sample Input 4 ...

  3. bzoj 1911: [Apio2010]特别行动队 2011-12-26

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 892  Solved: 359 [Submit][Statu ...

  4. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 4142  Solved: 1964 [Submit][Sta ...

  5. [BZOJ] 1911 [Apio2010]特别行动队

    题目描述 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如 (i, i + 1 ...

  6. 1911: [Apio2010]特别行动队

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 4061  Solved: 1922 [Submit][Sta ...

  7. APIO 2010题解

    APIO 2010题解 P3628 特别行动队 思路: 斜率优化dp,主要以推公式为主,设s为前缀和数组,可得 f[i]=f[j]+a∗s[i]∗s[i]+a∗s[j]∗s[j]−2∗a∗s[i]∗s ...

  8. bzoj1911【APIO2010】特别行动队

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec   Memory Limit: 64 MB Submit: 3600   Solved: 1651 [ Submit][ ...

  9. BZOJ1911 特别行动队

    目录 BZOJ1911 特别行动队 题解 code BZOJ1911 特别行动队 题目传送门 题解 典型的斜率优化\(Dp\).首先如果我们记\(sum[i]\)表示前\(i\)个士兵的战斗力之和,那 ...

最新文章

  1. Android面试题目之六---Handler,Looper和MessageQueue深入研究
  2. 本科生怎样发表论文?
  3. vue 实现无限轮播_用vue写一个轮播图效果
  4. java biginteger转int_如何在不使用java.math.BigInteger的情况下使用Java处理非常大的数字...
  5. Python学到什么程度可以面试工作?
  6. UVA 10603 - Fill(dijkstra + 状态图)
  7. 模电知识,大师 书本
  8. ubuntu11.10中配置OGRE1.8
  9. 如何用python计算levenshteindistance_Levenshtein计算相似度距离
  10. 非常有名的免费开源图库相册软件
  11. vue 上下滚动的菜单_vue实现广告栏上下滚动效果
  12. 《Running.Lean.2nd.Edition.Feb.2012》 读书笔记
  13. 包是如何通过交换机的
  14. 20175323 团队项目 服务器端函数功能与业务逻辑详解
  15. 美国网站服务器有哪些,可以搭建什么网站?
  16. 软件设计师教程(第5版)- 前言和目录
  17. 嵌入式系统之CMSIS学习笔记
  18. Android平板怎么抠图,Photoshop手机版怎么抠图去背景?
  19. python123英文字符的鲁棒_Robust Locally Weighted Regression 鲁棒局部加权回归 -R实现
  20. 2021.12.21报错解决:jquery.min.js:5 POST http://localhost:3000/login 400 (Bad Request)

热门文章

  1. OpenCV cvBoundingRect应用举例
  2. bs4爬虫:获取百度贴吧的内容
  3. 逻辑综合重点解析(Design Compiler篇)
  4. 初窥 fastlane 一键打包上传蒲公英平台和App Store
  5. 云计算、社交网络和移动互联网
  6. video.js 视频直播前端展示
  7. R语言LR逻辑回归实例
  8. notify()和notifyAll()的区别
  9. 利用状态机及Astar插件实现dots下寻路
  10. 关于多径效应,平坦衰落,频率选择性衰落以及瑞利衰落的理解