题目描述

你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场。出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如(i, i + 1, ..., i + k)(i,i+1,...,i+k)的序列。 编号为 i 的士兵的初始战斗力为 xi ,一支特别行动队的初始战斗力 x 为队内 士兵初始战斗力之和,即 x = x_i + x_{i+1} + ... + x_{i+k}x=xi​+xi+1​+...+xi+k​。

通过长期的观察,你总结出一支特别行动队的初始战斗力 x 将按如下经验公 式修正为 x':x'= ax^2+bx+cx′:x′=ax2+bx+c,其中 a, b, c 是已知的系数(a < 0)。 作为部队统帅,现在你要为这支部队进行编队,使得所有特别行动队修正后 战斗力之和最大。试求出这个最大和。

例如,你有 4 名士兵, x_1 = 2, x_2 = 2, x_3 = 3, x_4 = 4x1​=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,没有其它 方案能使修正后的战斗力和更大。

网上对斜率优化的解释太玄乎,我看不懂,所以用自己的方法来解释一下斜率优化:

所谓斜率优化,优化的是DP【i】=max(min)(C(i)+C(j)+K(j)*S(i))的dp方程

其中C(i)是只跟i有关的常数,c(j)是和j有关的常数,K(j)和S(i)是分别与ij有关的函数。

整理 得 DP【i】-C(i)=K(j)*S(i)+C(j),我们只要求K(j)*S(i)+C(j)的最值即可。

我们发现每一个J代表一条直线,其自变量为S(i),且S(i)单调递增。

那么我们可以动态的维护一个直线的集合,其K依次递增,C依次递减。(当存在一条直线的K,C都比另一条小时,那它就永远不会成为最优解)。

又因为K依次递增,C依次递减,而且S(i)单调递增,那么一条直线被他后面的直线追上后,就一直比被其追上的直线小了。(两线一交点)。

那么我们就可以这样来维护一个单调队列来优化DP了吗?

答案是否定的。

我们发现了反例。

我们考虑三条直线,y1=10,y2=X+9,y3=100x+1.

显然这三条直线在单调队列中是合法的。

但我们发现 y1和y2的交点在X=1处,y1与y3的交点却在X=0.09处。

按照我们刚才的做法,当X=0.5时,我们还是误以为y1是当前的最优直线,但事实上是y3最优。

所以我们在队尾加入直线时,要判当前要加的直线与前一条直线与前一条直线的前一条直线的交点哪一个在前,如果当前直线的交点在前的话,那就可以将队尾的直线弹出了,因为它已经没有机会成为最优解了。

#include<bits/stdc++.h>
#define B(x) (1ll*a*sum[x]*sum[x]+dp[x]-b*sum[x])//就是题解里的C(j),直线的截距,y=kx+b中的b
#define K(x) (-2ll*a*sum[x])//直线的斜率
#define N 1070001
#define LL long long
#define sight(C) (C<='9'&&C>='0')
using namespace std;
LL sum[N],q[N],n,m,x,head,tail,dp[N],a,b,c;
LL check(int x,int y) {//判断当前直线与i组合的DP值
return dp[y]+a*(sum[x]-sum[y])*(sum[x]-sum[y])+b*(sum[x]-sum[y])+c;
} char C;int B;
double jiao(int x,int y){ //求直线的交点
return 1.0*(B(x)-B(y))/(K(x)-K(y));
}
LL read(LL &x) {
C=getchar(); B=;
for(;!sight(C);C=getchar()) if (C=='-') B=-;
for(x=;sight(C);C=getchar()) x=x*+C-'';
x*=B;
}
int main () {
read(n);
read(a); read(b); read(c);
for (int i=;i<=n;i++)
read(x),sum[i]=sum[i-]+x;
head=tail=;
q[tail++]=;
for (int i=;i<=n;i++) {
while (head+<tail && check(i,q[head])<=check(i,q[head+])) head++;//当前解被超过,将其出队
dp[i]=check(i,q[head]);
while (head+<tail && jiao(q[tail-],i)<=jiao(q[tail-],i)) tail--;//i与q【tail-1】相比,i的交点在前,所以将q【tail-1】删除
q[tail++]=i;
}
printf("%lld\n",dp[n]);
return ;
}

[APIO2010]特别行动队的更多相关文章

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

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

  2. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...

  3. bzoj 1911 [Apio2010]特别行动队(斜率优化+DP)

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3191  Solved: 1450[Submit][Statu ...

  4. BZOJ 1911: [Apio2010]特别行动队( dp + 斜率优化 )

    sum为战斗力的前缀和 dp(x) = max( dp(p)+A*(sumx-sump)2+B*(sumx-sump)+C )(0≤p<x) 然后斜率优化...懒得写下去了... ------- ...

  5. bzoj1911[Apio2010]特别行动队 斜率优化dp

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 5057  Solved: 2492[Submit][Statu ...

  6. P3628 [APIO2010]特别行动队(斜率优化dp)

    P3628 [APIO2010]特别行动队 设$s[i]$为战斗力前缀和 显然我们可以列出方程 $f[i]=f[j]+a*(s[i]-s[j])^{2}+b*(s[i]-s[j])+c$ $f[i]= ...

  7. [luogu P3628] [APIO2010]特别行动队

    [luogu P3628] [APIO2010]特别行动队 题目描述 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特 ...

  8. 【bzoj1911】[Apio2010]特别行动队

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4048  Solved: 1913[Submit][Statu ...

  9. [APIO2010]特别行动队 --- 斜率优化DP

    [APIO2010]特别行动队 题面很直白,就不放了. 太套路了,做起来没点感觉了. \(dp(i)=dp(j)+a*(s(i)-s(j))^{2}+b*(s(i)-s(j))+c\) 直接推出一个斜 ...

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

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

随机推荐

  1. Redis在centos6.4上的最详细图文安装教程

    准备工作:一个redis3.0.0的安装包,没有可以点击下面的链接下载 https://pan.baidu.com/s/1kU5Ez2J 工具 安装环境   centos6.4 好了开始进入正题 输入 ...

  2. Abp扩展之【配置功能】

    Abp的扩展功能非常强大,配合持久化可以很方便的配置系统.租户.用户的配置,关于ABP的配置请参考: http://www.cnblogs.com/farb/p/ABPSettingManagemen ...

  3. 》》webpack打包成的文件

    /******/(function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installed ...

  4. hdu1754 I Hate It (线段树 更新点的值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. UVA 10465 Homer Simpson(全然背包: 二维目标条件)

    UVA 10465 Homer Simpson(全然背包: 二维目标条件) http://uva.onlinejudge.org/index.php? option=com_onlinejudge&a ...

  6. Springboot的默认定时任务——Scheduled注解

    本博客参考博文地址. 1.pom依赖: 引入springboot starter包即可 <dependencies> <dependency> <groupId>o ...

  7. 为 NativeScript 项目添加 iOS / Android 平台 API 的智能感知

    使用 NativeScript ,我们可以很容易的调用平台的原生 API,在开发过程中,我们可以添加这些 API 的 d.ts 文件来提供智能感知,帮助我们更方便的构建媲美原生的 APP. 首先通过 ...

  8. 摧枯拉朽,说说ES6的三把火

    阅读目录 我是 Jser 我骄傲 作用域 模块系统 类(Class) 我是 Jser 我骄傲 JavaScript 如今可谓是屌丝逆袭高富帅的代名词哈,从当初闹着玩似的诞生到现在 Github 上力压 ...

  9. 主次设备号 Device Major and Minor Numbers

    对于一个设备文件而言真正重要的标志是它的主次设备号(major and minor device numbers).如果我们用ls命令列出/dev下的一个设备: frank@under:~$ ls - ...

  10. License友好的前端组件合集

    在做Web开发过程中,不可避免的会用到各种UI组件.通常,我们并不会需要什么组件,都去自己开发的,网上有那么多好用的,我们为什么要自己造轮子呢?我通常只会在网上找不到合适的组件时,才会去自己开发一套. ...