2018.09.07 bzoj1911: [Apio2010]特别行动队(斜率优化dp)
传送门
斜率优化dp经典题。
题目中说的很清楚,设f[i]表示前i个数分配出的最大值。
那么有:
f[i]=max(f[j]+A∗(sum[i]−sum[j])2+B∗(sum[i]−sum[j])+C)" role="presentation" style="position: relative;">f[i]=max(f[j]+A∗(sum[i]−sum[j])2+B∗(sum[i]−sum[j])+C)f[i]=max(f[j]+A∗(sum[i]−sum[j])2+B∗(sum[i]−sum[j])+C)
=>
f[i]=max(f[j]+A∗sum[j]2−2∗A∗sum[i]∗sum[j]−B∗sum[j])+A∗sum[i]2+B∗sum[i]+C" role="presentation" style="position: relative;">f[i]=max(f[j]+A∗sum[j]2−2∗A∗sum[i]∗sum[j]−B∗sum[j])+A∗sum[i]2+B∗sum[i]+Cf[i]=max(f[j]+A∗sum[j]2−2∗A∗sum[i]∗sum[j]−B∗sum[j])+A∗sum[i]2+B∗sum[i]+C
同样是比较两个决策k1,k2如果k1优于k2,那么:
f[k1]+A∗sum[k1]2−2∗A∗sum[i]∗sum[k1]−B∗sum[k1]" role="presentation" style="position: relative;">f[k1]+A∗sum[k1]2−2∗A∗sum[i]∗sum[k1]−B∗sum[k1]f[k1]+A∗sum[k1]2−2∗A∗sum[i]∗sum[k1]−B∗sum[k1]
>
f[k2]+A∗sum[k2]2−2∗A∗sum[i]∗sum[k2]−B∗sum[k2])" role="presentation" style="position: relative;">f[k2]+A∗sum[k2]2−2∗A∗sum[i]∗sum[k2]−B∗sum[k2])f[k2]+A∗sum[k2]2−2∗A∗sum[i]∗sum[k2]−B∗sum[k2])
为了让每次查询的斜率单调递增。
我们需要巧妙地移项:
令t[k]=f[k]+A∗sum[k]2−B∗sum[k]" role="presentation" style="position: relative;">t[k]=f[k]+A∗sum[k]2−B∗sum[k]t[k]=f[k]+A∗sum[k]2−B∗sum[k]
=>(t[k1]−t[k2])>2∗A∗sum[i]∗(sum[k1]−sum[k2])" role="presentation" style="position: relative;">(t[k1]−t[k2])>2∗A∗sum[i]∗(sum[k1]−sum[k2])(t[k1]−t[k2])>2∗A∗sum[i]∗(sum[k1]−sum[k2])
=>slope(k1,k2)/A<2∗sum[i]" role="presentation" style="position: relative;">slope(k1,k2)/A<2∗sum[i]slope(k1,k2)/A<2∗sum[i]
搞定了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 1000005
using namespace std;
inline ll read(){
ll ans=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*w;
}
int n,q[N],hd,tl;
ll A,B,C,sum[N],f[N];
inline double slope(int i,int j){return 1.0*(sum[i]+sum[j])+(1.0*(f[i]-f[j])/(sum[i]-sum[j])-B)*1.0/A;}
int main(){
n=read(),A=read(),B=read(),C=read(),hd=tl=1;
for(int i=1;i<=n;++i)sum[i]=sum[i-1]+read();
for(int i=1;i<=n;++i){
while(hd<tl&&slope(q[hd+1],q[hd])<2*sum[i])++hd;
int j=q[hd];
f[i]=f[j]+A*(sum[i]-sum[j])*(sum[i]-sum[j])+B*(sum[i]-sum[j])+C;
while(hd<tl&&slope(i,q[tl])<slope(q[tl],q[tl-1]))--tl;
q[++tl]=i;
}
cout<<f[n];
return 0;
}
2018.09.07 bzoj1911: [Apio2010]特别行动队(斜率优化dp)的更多相关文章
- bzoj1911[Apio2010]特别行动队 斜率优化dp
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 5057 Solved: 2492[Submit][Statu ...
- 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 ...
- [APIO2010]特别行动队 --- 斜率优化DP
[APIO2010]特别行动队 题面很直白,就不放了. 太套路了,做起来没点感觉了. \(dp(i)=dp(j)+a*(s(i)-s(j))^{2}+b*(s(i)-s(j))+c\) 直接推出一个斜 ...
- APIO2010 特别行动队 & 斜率优化DP算法笔记
做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...
- 【BZOJ1911】[Apio2010]特别行动队 斜率优化DP
想了好久啊....——黑字为第一次更新.——这里是第二次更新,维护上下凸包据题而论,第一种方法是化式子的方法,需要好的化式子的方法,第二种是偏向几何,十分好想,纯正的维护凸包的方法,推荐. 用了我感觉 ...
- [Bzoj1911][Apio2010]特别行动队(斜率优化)
题目链接 斜率优化的经典模型,将序列分成若干段,每段有一个权值计算方法,求权值和最大/小 暴力的dp $O(n^{2})$ dp[i]为1-i的序列的最优解.sum[i]为前缀和,$D(i)=ax^{ ...
- 2018.09.07 bzoj1096: [ZJOI2007]仓库建设(斜率优化dp)
传送门 斜率优化dp经典题. 令f[i]表示i这个地方修建仓库的最优值,那么答案就是f[n]. 用dis[i]表示i到1的距离,sump[i]表示1~i所有工厂的p之和,sum[i]表示1~i所有工厂 ...
- bzoj 1911: [Apio2010]特别行动队 -- 斜率优化
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MB Description Input Output Sample Input 4 ...
随机推荐
- 机器学习入门-提取文章的主题词 1.jieba.analyse.extract_tags(提取主题词)
1.jieba.analyse.extract_tags(text) text必须是一连串的字符串才可以 第一步:进行语料库的读取 第二步:进行分词操作 第三步:载入停用词,同时对分词后的语料库进行 ...
- C++Primer笔记-----day07
==========================================================================day07===================== ...
- ncodeURIComponent() 函数 vue内容
ncodeURIComponent() 函数 编辑 encodeURIComponent() 函数[1] 作用:可把字符串作为URI 组件进行编码.其返回值URIstring 的副本,其中的某些字符 ...
- zookeeper 初步学习
配置文件: tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳. dataDir:顾名思义就是 ...
- keras各种优化方法总结 SGDmomentumnesterov
http://blog.csdn.net/luo123n/article/details/48239963 前言 这里讨论的优化问题指的是,给定目标函数f(x),我们需要找到一组参数x,使得f(x)的 ...
- docker 配置远程访问
系统: centos 7 Docker version 1.12.6 yum 安装的 #yum install docker docker server在192.168.111.120上 # vim ...
- idea 打包java程序
创建maven项目 在pom.xml中添加: <build> <plugins> <plugin> <groupId>org.apache.maven. ...
- 查看android sha1
Android百度定位SDK自v4.0版本之后开始引入了百度地图开放平台的统一AK验证体系.通过AK机制,开发者可以更方便.更安全地配置自身使用的百度LBS资源(如设置服务配额等).随着LBS开放平台 ...
- RNA-seq 安装 fastaqc,tophat,cuffilnks,hisat2
------------------------------------------ 安装fastqc------------------------------------------------- ...
- 格式化java8 LocalDateTime
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(time1);