BZOJ 1911: [Apio2010]特别行动队
又是斜率dp= =
f[i]=MAX(f[x]+a*sqr(f[i]-f[x])+b*(f[i]-f[x])+c)
设对于f[x] f[i]+a*sqr(s[x]-s[i])+b*(s[x]-s[i])+c>f[j]+a*sqr(s[x]-s[j])+b*(s[x]-s[j])+c
整理得 (v(i)-v[j])/(s[i]-s[j])<2a*s[x] (v[x]=f[x]+a*s[x]*s[x]-b*s[x])
然后就证明s[x]单调
就行了
CODE:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1000010
long long f[maxn],sum[maxn];
int s[maxn],a,b,c,n;
long long v(int x,int y){
return (f[x]+a*sum[x]*sum[x]-b*sum[x])-(f[y]+a*sum[y]*sum[y]-b*sum[y]);
}
int main(){
scanf("%d",&n);
scanf("%d%d%d",&a,&b,&c);
for (int i=1;i<=n;i++) {
int x;
scanf("%d",&x);
sum[i]=sum[i-1]+x;
}
s[1]=0;
int h=1,t=1;
for (int i=1;i<=n;i++){
while (h<t&&v(s[h],s[h+1])<=2*a*sum[i]*(sum[s[h]]-sum[s[h+1]]))h++;
f[i]=f[s[h]]+a*(sum[i]-sum[s[h]])*(sum[i]-sum[s[h]])+b*(sum[i]-sum[s[h]])+c;
while (h<t&&v(s[t],i)*(sum[s[t-1]]-sum[s[t]])>=v(s[t-1],s[t])*(sum[s[t]]-sum[i])) t--;
s[++t]=i;
}
printf("%lld\n",f[n]);
return 0;
}
转载于:https://www.cnblogs.com/New-Godess/p/4348956.html
BZOJ 1911: [Apio2010]特别行动队相关推荐
- bzoj 1911: [Apio2010]特别行动队 -- 斜率优化
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MB Description Input Output Sample Input 4 ...
- bzoj 1911: [Apio2010]特别行动队 2011-12-26
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 892 Solved: 359 [Submit][Statu ...
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 4142 Solved: 1964 [Submit][Sta ...
- [BZOJ] 1911 [Apio2010]特别行动队
题目描述 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如 (i, i + 1 ...
- bzoj 1911: [Apio2010]特别行动队【斜率优化dp】
仔细想想好像没学过斜率优化.. 很容易推出状态转移方程\( f[i]=max{f[j]+a(s[i]-s[j])^2+b(s[i]-s[j])+c} \) 然后考虑j的选取,如果选j优于选k,那么: ...
- 1911: [Apio2010]特别行动队
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 4061 Solved: 1922 [Submit][Sta ...
- [APIO2010]特别行动队
题面在这里 题意 你有一支由\(n\)名预备役士兵组成的部队,士兵从\(1\)到\(n\)编号,要将他们拆分 成若干特别行动队调入战场. 出于默契的考虑,同一支特别行动队中队员的编号应该连续,即为形如 ...
- [APIO2010] 特别行动队
题目描述 你有一支由n名预备役士兵组成的部队,士兵从1到n编号,要将他们拆分成若干特别行动队调入战场.出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,-,i+k)的序列. 编 ...
- 【斜率优化】[APIO2010]特别行动队
题目 题目描述 你有一支由 nn 名预备役士兵组成的部队,士兵从 11 到 nn 编号,你要将他们拆分成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号应该连续,即为形如 (i, ...
最新文章
- linux kvm虚拟化命令,Linux系统下kvm虚拟化(三)日常管理常用命令和配置说明
- 马化腾发起的科学探索奖首次颁出,50名中国大陆青年学者获奖,每人获300万资助...
- mdx词典包_推荐几款实用的英语词典
- Linux 软件包管理命令
- plsql developer无监听程序_无停机优雅重启 Go 程序
- 算法设计与分析——贪心算法——背包问题
- QuickBooks和Sage数据导出器
- linux下飞信安装详细过程
- STC学习:霍尔开关器件
- 飞桨2.0高层api教程——使用BERT实现自动写诗
- 基础柱状图的高配-多色柱状图
- 业务流程图(TFD)实例
- python搜索引擎的设计与实现_Python搜索引擎实现原理和方法
- simplest_ffmpeg_streamer加注释版
- 小米手机刷机-线刷-以K30Pro为例
- Python3高级篇
- C语言中的%p是什么意思?
- 会话、张量、变量OP
- 数字集成电路设计-1-用一个mux和一个inv实现异或
- 第2章 C语言的数值数据与非数值数据 (二)
热门文章
- 相分离相关文章阅读Cancer-Specific Retargeting of BAF Complexes by a Prion-like Domain
- java批量上传文件_Spring Boot2(十四):单文件上传/下载,文件批量上传
- 使用ggplot2画图
- python请输入星期几的第一个_python如何获取星期几
- php监测tomcat,java_JAVA实现监测tomcat是否宕机及控制重启的方法,本文实例讲述了JAVA实现监测tom - phpStudy...
- PHP两文件嵌套循环引用,php的循环与引用的一个坑,php循环引用_PHP教程
- 左右边界二分查找小总结
- 系统学习机器学习之神经网络(十) --BAM网络
- KNN(七)--最近邻及OpenCV源码分析
- mapreduce task与spark task对比