洛谷P3628 [APIO2010]特别行动队(动态规划,斜率优化,单调队列)
安利蒟蒻斜率优化总结
由于人是每次都是连续一段一段地选,所以考虑直接对\(x\)记前缀和,设现在的\(x_i=\)原来的\(\sum\limits_{j=1}^ix_i\)。
设\(f_i\)为安排前\(i\)个人的最大值\((f_0=0)\)
\(f_i=\max\limits_{j=0}^{i-1}\{f_j+a(x_i-x_j)^2+b(x_i-x_j)+c\}\)
\(\quad=\max\limits_{j=0}^{i-1}\{f_j-2ax_ix_j+ax_j^2-bx_j\}+ax_i^2+bx_i+c\)
决策\(j\)比\(k\)优当且仅当
\]
\]
于是每个决策可以看成是一个点\((x_i,y_i)(y_i=f_i+ax_i^2-bx_i)\)
不用考虑变号。因为\(a<0\),\(x_i\)递增,斜率\(2ax_i\)递减,所以我们用单调队列维护一个下凸包就行了。依旧是维护队首为当前最优解。
当然注意这里的转移是从\(0\)到\(i-1\),所以和土地征用有点点不一样,要先求出\(f_i\)再加入决策点\(i\)。
纯天然代码
#include<cstdio>
#define RG register
#define R RG int
#define G c=getchar()
#define Calc(j,k) (y[j]-y[k])/(x[j]-x[k])//求斜率
const int N=1e6+9;
int q[N];
double f[N],k[N],x[N],y[N];//变量名同上
inline int in(){
RG char G;RG bool f=0;
while(c<'-')G;
if(c=='-')f=1,G;
R x=c&15;G;
while(c>'-')x=x*10+(c&15),G;
return f?-x:x;
}
int main(){
R n=in(),i,h,t;
RG double a=in(),b=in(),c=in(),now;
for(i=h=t=1;i<=n;++i){
x[i]=x[i-1]+in();//前缀和
now=2*a*x[i];//当前斜率
while(h<t&&k[h]>=now)++h;
f[i]=-now*x[q[h]]+y[q[h]]+(a*x[i]+b)*x[i]+c;//先求fi,根据定义式求
y[i]=f[i]+(a*x[i]-b)*x[i];//yi跟着求
while(h<t&&k[t-1]<=Calc(q[t],i))--t;//维护凸包
k[t]=Calc(q[t],i);q[++t]=i;
}
printf("%.0lf\n",f[n]);
return 0;
}
洛谷P3628 [APIO2010]特别行动队(动态规划,斜率优化,单调队列)的更多相关文章
- 洛谷P3628 [APIO2010]特别行动队(斜率优化)
传送门 先写出转移方程$$dp[i]=max\{dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c\}$$ 假设$j$比$k$更优,则有$$dp[j]+a*(s ...
- 洛谷3628 APIO2010特别行动队(斜率优化)
考虑最普通的\(dp\) \[dp[i]=max(dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c \] qwq 由于演算纸扔掉了 qwq 所以直接给出最后的 ...
- 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]= ...
- [洛谷P3628] [APIO2010]特别行动队
洛谷题目链接:[APIO2010]特别行动队 题目描述 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 \(n\) 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动 ...
- [bzoj1911][Apio2010特别行动队] (动态规划+斜率优化)
Description Input Output Sample Input - - Sample Output HINT Solution 斜率优化动态规划 首先易得出这样的一个朴素状态转移方程 f[ ...
- BZOJ1911 [Apio2010]特别行动队 - 动态规划 - 斜率优化
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 UPD(2018-04-01):用Latex重打了公式…… 题意概括 把一个整数序列划分成任意连续的段,使得划分出 ...
- 洛谷P3628 [APIO2010]特别行动队 斜率优化
裸题,注意队列下标不要写错 Code: #include<cstdio> #include<algorithm> #include<cmath> using nam ...
- 洛谷 P3628 [APIO2010]特别行动队
题意简述 将n个士兵分为若干组,每组连续,编号为i的士兵战斗力为xi 若i~j士兵为一组,该组初始战斗力为\( s = \sum\limits_{k = i}^{j}xk \),实际战斗力\(a * ...
- 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...
随机推荐
- xshell替代工具finalShell
主要特性:1.多平台支持Windows,Mac OS X,Linux2.多标签,批量服务器管理.3.支持登录Ssh和Windows远程桌面.4.漂亮的平滑字体显示,内置100多个配色方案.5.终端,s ...
- SpringBoot 异常处理
异常处理最佳实践 根据我的工作经历来看,我主要遵循以下几点: 尽量不要在代码中写try...catch.finally把异常吃掉. 异常要尽量直观,防止被他人误解 将异常分为以下几类,业务异常,登录状 ...
- China Intelligent Office Summit(2018.11.21)
时间:2018.11.21地点:中关村软件园国际会议中心
- python打印列表的下标和值的例子:
python打印列表的下标和值的例子: In [1]: list01=[1,4,5] In [10]: def funct01(ll): ....: for index,value in ...
- Scala学习(五)练习
Scala中的类&练习 1. 改进Counter类,让它不要在Int.MaxValue时变成负数 程序代码: class Counter { private var value=100 def ...
- socket、tcp、udp、http 的认识及区别
一.先来一个讲TCP.UDP和HTTP关系的 1.TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输 ...
- WPF开发汽车采样机上位机软件
由于项目需要,需开发同一套汽车.火车.皮带采样机的上位机软件. 看过之前的上位机软件,老版本都是DelPhi.VB开发,稍微新语言开发的是采用winform开发.要不就是使用组态软件. Delphi语 ...
- linux下expect环境安装以及简单脚本测试
expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装 下 ...
- Redis常用操作-----字符串
1.APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾. 如果 key 不存在, APPEND 就简单地将给定 ...
- B. Vasya and Isolated Vertices
链接 [http://codeforces.com/contest/1065/problem/B] 题意 给你n个点,m条边,让你找最多孤立点和最少孤立点,不能有自环路 分析 对于最少max(0,n- ...