BZOJ 1911 特别行动队 (斜率优化)
$ BZOJ1911*~ $ 特别行动队: (斜率优化)

$ solution: $
感觉这道题目还是比较常规的,首先我们很容易想到DP,因为题目里面说了选出的人都是连续的,这意味着我们可以从前往后DP。我们直接设 \(f[i]\) 表示前 \(i\) 在分组之后的战斗力之和(因为题目没有明确要求分几组,所以我们省去这一维度)。然后转移也比较常规,我们枚举前面的某一个人 \(k\) 作为这一组人的左端点(右端点就是第 \(i\) 个人)。这题数据范围很大,我们也不用着急,现将式子列出来,如果转移不能优化再另寻他法。(事实上这种没有性质的DP,优化只能靠转移方程)
转移方程:
$ F[i]=F[k]+a\times (S[i]-S[k])^2+b\times(S[i]-S[k])+c $
把这个式子拆开你就会看到一个与 \(i,k\) 都有关的乘积项,这是斜率优化的标志:
$ F[i] = F[k] + a\times S[i]^2 - 2a\times S[i]\times S[k] + a\times S[k]^2+b\times S[i] - b\times S[k] + c $
然后我们将同一类的项移动到一起,化为斜率优化的标准式:
$ F[k] + a\times S[k]^2 - b\times S[k] = + 2a\times S[i]\times S[k] + F[i] -a\times S[i]^2 - b\times S[i] - c $
然后我们将 乘积项\(2a\times S[i]\times S[k]\) 里面有关于 \(k\) 的 \(S[k]\) 作为横坐标(自变量) ,然后等式右边有关 \(k\) 的项 \(F[k] + a\times S[k]^2 - b\times S[k]\) 作为纵坐标(应变量)。然后我们要 \(F[i]\) 最大,其实就是让截距 \(F[i] -a\times S[i]^2 - b\times S[i] - c\) 最大。于是直接斜率优化即可。
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define rg register int
using namespace std;
int n;
ll a,b,c;
int s[1000005];
int q[1000005];
ll g[1000005];
ll f[1000005];
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar()))if(ch=='-')sign=1;
while(isdigit(ch))res=res*10+(ch^48),ch=getchar();
if(sign)return -res; else return res;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr(); a=qr(); b=qr(); c=qr(); rg l=1,r=0;
for(rg i=1;i<=n;++i) s[i]=s[i-1]+qr();
for(rg i=1;i<=n;++i){ q[++r]=i-1;
while(l<r&&g[q[l+1]]-g[q[l]]>=2*a*s[i]*(s[q[l+1]]-s[q[l]]))++l;
rg x=s[i]-s[q[l]];
f[i]=f[q[l]]+a*x*x+b*x+c;
g[i]=f[i]+a*s[i]*s[i]-b*s[i];
while(l<r&&(g[q[r]]-g[q[r-1]])*(s[i]-s[q[r]])<=(g[i]-g[q[r]])*(s[q[r]]-s[q[r-1]]))--r;
}printf("%lld\n",f[n]);
return 0;
}
BZOJ 1911 特别行动队 (斜率优化)的更多相关文章
- BZOJ 1911 特别行动队(斜率优化DP)
应该可以看出这是个很normal的斜率优化式子.推出公式搞一搞即可. # include <cstdio> # include <cstring> # include < ...
- bzoj1911 [Apio2010]特别行动队——斜率优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1911 相当明显的斜率优化,很好做: 注意slp里面要有(double),以免出现精度问题. ...
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- bzoj 1911: [Apio2010]特别行动队 -- 斜率优化
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MB Description Input Output Sample Input 4 ...
- 【斜率DP】BZOJ 1911:特别行动队
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3006 Solved: 1360[Submit][Statu ...
- bzoj1911[Apio2010]特别行动队 斜率优化dp
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 5057 Solved: 2492[Submit][Statu ...
- [APIO2010]特别行动队 --- 斜率优化DP
[APIO2010]特别行动队 题面很直白,就不放了. 太套路了,做起来没点感觉了. \(dp(i)=dp(j)+a*(s(i)-s(j))^{2}+b*(s(i)-s(j))+c\) 直接推出一个斜 ...
- APIO 2010 特别行动队 斜率优化DP
Description 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如 (i ...
- APIO2010 特别行动队 & 斜率优化DP算法笔记
做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...
随机推荐
- 13-1 jquery操作cookie
jQuery之cookie操作 Cookies 定义:让网站服务器把少量数据存储到客户端的硬盘或内存,从客户端的硬盘里读取数据的一种技术; 下载与引入:jquery.cookie.js基于jquery ...
- qbzt day3 晚上 平衡树的一些思想
pks大佬的blog 二叉查找树 任何一个节点左子树的所有元素都小于这个节点,右子树的所有元素都大于这个节点 查找一个节点:从根节点开始,比他小就向左走,比他大就向右走 平衡树:解决二叉查找树的一些痛 ...
- Netty 系列之 Netty 高性能之道 高性能的三个主题 Netty使得开发者能够轻松地接受大量打开的套接字 Java 序列化
Netty系列之Netty高性能之道 https://www.infoq.cn/article/netty-high-performance 李林锋 2014 年 5 月 29 日 话题:性能调优语言 ...
- page size
https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_page_size https://dev.mysql.com/doc/refma ...
- fedora23中安装php-mysql等
scheme: [ski:M], ch本身还是发的k音, 如同school, 但爆破后发g 默认的, by default. 没有defaultly 基本上所有的短语, 修饰名词都是放在名词的后面的: ...
- Python字典的json格式化处理(换行与不换行)
Prefer = {"jim": {"War": 1.9, "the big bang": 1.0, "The lord of w ...
- python练习题--计算总分平均分操作excel
''' 有一个存着学生成绩的文件,里面存的是json串,json串读起来特别不直观,需要你写代码把它都写到excel中,并计算出总分和平均分,json格式如下 { "1":[&qu ...
- Oracle-优化SQL语句
建议不使用(*)来代替所有列名 用truncate代替delete 在SQL*Plus环境中直接使用truncate table即可:要在PL/SQL中使用,如: 创建一个存储过程,实现使用trunc ...
- 在自定义组件中获取spring底层组件
要想在自定义组件中获取spring底层的各种组件,只需让自定义组件实现一系列接口即可,这些接口都是Aware的子接口.常见的有: 1. ApplicationContextAware——用于获取IOC ...
- Java接口继承
Java中接口可以继承接口,并且可以多继承.