【BZOJ1911】【APIO2010】特别行动队

题面

Description

你有一支由 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,没有其它方案能使修正后的战斗力和更大。

Input

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

Output

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

Sample Input

4

-1 10 -20

2 2 3 4

Sample Output

9

Hint

20%的数据中, n ≤ 1000;

50%的数据中, n ≤ 10,000;

100%的数据中, 1 ≤ n ≤ 1,000,000, –5 ≤ a ≤ –1, |b| ≤ 10,000,000, |c| ≤10,000,000, 1 ≤ xi ≤ 100。

题解

如果公式挂了到CSDN上去看

又是一道斜率优化的DP题目

首先还是写出一个\(O(n^{2})\)的DP

	for(int i=1;i<=n;++i)
for(int j=0;j<i;++j)
f[i]=max(f[i],f[j]+F(c[i]-c[j]));

其中\(F(x)\)是题目中的二次函数\(c[i]\)是前缀和

还是和之前是一样的

假设\(j\)的转移优于\(k\)

那么就有

\[f[j]+F(c[i]-c[j])>f[k]+F(c[i]-c[k])
\]

又有

\[F(x)=Ax^{2}+Bx+C
\]

直接带入得到

\[f[j]+A(c[i]-c[j])^{2}+B(c[i]-c[j])+C
\]

右边同理

然后两边同时减掉一部分得

\[f[j]+Ac[j]^{2}-2Ac[i]c[j]-Bc[j]>f[k]+Ac[k]^{2}-2Ac[i]c[k]-Bc[k]
\]

移项得到

\[2Ac[i](c[j]-c[k])<(f[j]+Ac[j]^{2}-Bc[j])-(f[k]+Ac[k]^{2}-Bc[k])
\]

除过去搞一下

\[c[i]>\frac{(f[j]+Ac[j]^{2}-Bc[j])-(f[k]+Ac[k]^{2}-Bc[k])}{2A(c[j]-c[k])}
\]

然后就可以斜率优化直接搞了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
using namespace std;
#define ll long long
#define MAX 1010000
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
ll A,B,C;
ll n,c[MAX];
ll F(ll x){return 1LL*A*x*x+1LL*B*x+C;}
ll f[MAX];
ll s[MAX],h,t;
ll sqr(ll x){return x*x;}
double count(ll j,ll k)
{
return ((f[j]-B*c[j]+A*sqr(c[j]))-(f[k]-B*c[k]+A*sqr(c[k])))/(2.0*A*(c[j]-c[k]));
}
int main()
{
n=read();A=read();B=read();C=read();
for(int i=1;i<=n;++i)c[i]=c[i-1]+read();
for(int i=1;i<=n;++i)f[i]=-1e18;
/*
for(int i=1;i<=n;++i)
for(int j=0;j<i;++j)
f[i]=max(f[i],f[j]+F(c[i]-c[j]));
*/
for(int i=1;i<=n;++i)
{
while(h<t&&count(s[h],s[h+1])<=c[i]*1.0)h++;
int get=s[h];
f[i]=f[get]+F(c[i]-c[get]);
while(h<t&&count(s[t-1],s[t])>=count(s[t],i))t--;
s[++t]=i;
}
printf("%lld\n",f[n]);
return 0;
}

【BZOJ1911】【APIO2010】特别行动队(斜率优化,动态规划)的更多相关文章

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

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

  2. bzoj1911 [Apio2010]特别行动队——斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1911 相当明显的斜率优化,很好做: 注意slp里面要有(double),以免出现精度问题. ...

  3. [Bzoj1911][Apio2010]特别行动队(斜率优化)

    题目链接 斜率优化的经典模型,将序列分成若干段,每段有一个权值计算方法,求权值和最大/小 暴力的dp $O(n^{2})$ dp[i]为1-i的序列的最优解.sum[i]为前缀和,$D(i)=ax^{ ...

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

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

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

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

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

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

  7. APIO2010 特别行动队 & 斜率优化DP算法笔记

    做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...

  8. 【BZOJ1911】[Apio2010]特别行动队 斜率优化DP

    想了好久啊....——黑字为第一次更新.——这里是第二次更新,维护上下凸包据题而论,第一种方法是化式子的方法,需要好的化式子的方法,第二种是偏向几何,十分好想,纯正的维护凸包的方法,推荐. 用了我感觉 ...

  9. 洛谷P3628 [APIO2010]特别行动队 斜率优化

    裸题,注意队列下标不要写错 Code: #include<cstdio> #include<algorithm> #include<cmath> using nam ...

  10. [bzoj1911][Apio2010特别行动队] (动态规划+斜率优化)

    Description Input Output Sample Input - - Sample Output HINT Solution 斜率优化动态规划 首先易得出这样的一个朴素状态转移方程 f[ ...

随机推荐

  1. 从Myeclipse到Intelj Idea

    前言:经历了从eclipse到Myeclipse的时间,大学时候用Eclipse,开始工作的时候选择Myeclipse,都能体会到Java的IDE的先进和高明之处,直到最近,公司项目采git和Grad ...

  2. GitHub入门与实践

    基本命令 git status 工作区状态 git add git commint 暂存区 git push gitHub客户端 下载网址:https://desktop.github.com/ 解决 ...

  3. 测试同学难道要写一辈子的hello world?

    最近我们在测试团队内推行自动化用例责任制,大致的意思是:我们安排培训资源,提供技术支持和一对一辅导,要求每一个自主选择了自动化和接口测试发展通道的同学必须让自己负责的项目自动化用例覆盖率有所提升. 后 ...

  4. 一种解决eclipse中安装maven出错的方法

    1.安装步骤:https://jingyan.baidu.com/article/a17d5285feb4dd8099c8f26e.html 2.安装第三步的解决办法:m2e   路径换成  http ...

  5. PHP动态编译出现Cannot find autoconf的解决方法

    wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz tar -zvxf m4-.tar.gz cd m4-/ ./configure && m ...

  6. Oauth认证协议

    原文地址腾讯QQ第三方登录的实现原理? Oauth当中的角色: 1.Service Provider(服务提供方): 服务提供方通常是网站,在这些网站当中存储着一些受限制的资源,如照片.视频.联系人列 ...

  7. typeahead + JDK 8 并行流 + redis 高速即时查询.

    感谢JDK8,让我们JAVA 程序员暂时不用担心失业. 有些情况,需要根据用户输入值,即时查询数据库,MYSQL显然不再适合这种业务. mongoDB看似最适合,但是为了这么一个破功能,也不值得特意去 ...

  8. SQL 分组统计 行转列 CASE WHEN 的使用

    原文地址:http://blog.itpub.net/26451903/viewspace-733526 原文在分组统计部分  sql是有问题的     本文已将sql改正   已用红色标记  Cas ...

  9. webpack代码分离 ensure 看了还不懂,你打我(转)

    webpack异步加载的原理 webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这 个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的, ...

  10. Jenkins Android 自动打包配置

    一.Jenkins自动打包配置 目标:1. 自动打包:2. 自动上传:3. 友好下载 1. Jenkins简介 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作. 减少重复劳 ...