题目

洛谷 & bzoj

简要题意:给定一个长为\(n\)的序列\(\{s_i\}\)与常数\(a,b,c\),序列的一个连续子段\(s_i\)到\(s_j\)的贡献为\(at^2+bt+c\),\(t\)为子段内元素和,求一种切割序列的方法,使得总贡献最大,输出最大值

Solution

前置技能:Dp、斜率优化

这题看上去和\(APIO2010\)序列分割比较像,只是那道题更简单,要能做出这题首先在看到时就至少要想到\(O(n^2)\)的Dp,如果这个不会的话建议不要做这题,Dp方程:

\(f[i]=max\{f[j]+v(\sum_{k=i}^js[k])\},v(x)\)为计算贡献的函数

考虑到题目给的数据明显是\(O(n)\)的算法,也就是斜率优化的队列可以解决,首先设序列前缀和为\(s\)(之后不会提及原序列,用\(s\)表示序列前缀和)

\(f[i]=max\{f[j]+v(s[j]-s[i])\},j\in [1,i)\)

考虑从\(k\)转移比\(j\)优,则有

\(f_j+a(s_i-s_j)^2+b(s_i-s_j)+c\leq f_k+a(s_i-s_k)^2+b(s_i-s_k)+c\)

消去同类项

\(f_j+as_j^2-2as_is_j-bs_j\leq f_k+as_k^2-2as_is_k-bs_k\)

将\(a,b\)分别汇总

\(f_j+b(s_k-s_j)\leq f_k+a(2s_is_j-2s_is_k+s_k^2-s_j^2)\)

提出右边的公因式

\(f_j+b(s_k-s_j)\leq f_k+a(s_j-s_k)(2s_i-s_j-s_k)\)

左右拥有公因式合并

\(f_j-f_k\leq (s_j-s_k)\bigl[a(2s_i-s_j-s_k)+b\bigr]\)

转移(分式居中看得清楚一些)

\[\frac {f_j-f_k}{s_j-s_k}\leq a(2s_i-s_j-s_k)+b
\]

剔除含\(i\)的部分(这里别忘记\(a<0\),不等式要反向)

\[2s_i\geq \frac {\frac {f_j-f_k}{s_j-s_k}-b}a+s_j+s_k
\]

单调队列维护即可

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rg register template <typename _Tp> inline _Tp read(_Tp&x){
char c11=getchar(),ob=0;x=0;
while(c11^'-'&&!isdigit(c11))c11=getchar();if(c11=='-')ob=1,c11=getchar();
while(isdigit(c11))x=x*10+c11-'0',c11=getchar();if(ob)x=-x;return x;
} const int N=1001000;
int q[N],he,ta,n;
ll f[N],s[N],a,b,c; inline double slp(int i,int j)
{return (((1.0*f[j]-f[i])/(1.0*s[j]-s[i]))-b)/a+(1.0*s[i]+s[j]);} int main(){
read(n);read(a);read(b);read(c);he=ta=1;
for(rg int i=1;i<=n;++i)read(s[i]),s[i]+=s[i-1];
for(rg int i=1,j;i<=n;++i){
while(he<ta&&slp(q[he],q[he+1])<=s[i]+s[i])++he;j=q[he];
f[i]=f[j]+a*(s[i]-s[j])*(s[i]-s[j])+b*(s[i]-s[j])+c;
while(he<ta&&slp(q[ta],i)<=slp(q[ta-1],q[ta]))--ta;
q[++ta]=i;
}printf("%lld\n",f[n]);
return 0;
}

题解-APIO2010 特别行动队的更多相关文章

  1. 【bzoj1911】[Apio2010]特别行动队

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

  2. [洛谷P3628] [APIO2010]特别行动队

    洛谷题目链接:[APIO2010]特别行动队 题目描述 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 \(n\) 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动 ...

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

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

  4. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...

  5. bzoj 1911 [Apio2010]特别行动队(斜率优化+DP)

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

  6. BZOJ 1911: [Apio2010]特别行动队( dp + 斜率优化 )

    sum为战斗力的前缀和 dp(x) = max( dp(p)+A*(sumx-sump)2+B*(sumx-sump)+C )(0≤p<x) 然后斜率优化...懒得写下去了... ------- ...

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

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

  8. 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]= ...

  9. [luogu P3628] [APIO2010]特别行动队

    [luogu P3628] [APIO2010]特别行动队 题目描述 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特 ...

随机推荐

  1. 网络编程基础【day09】:堡垒机前戏(十一)

    本节内容 1.堡垒机前戏 2.SSHClient 3.SFTPClient 一.堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 ...

  2. JAVA核心技术I---JAVA基础知识(查漏补缺private,static)

    一:private对于类和对象(同C++) private是只有这个类内部可以访问(类的成员函数和定义初始化) private是类之间的限制,而不是对对象的限制<重点> 同类对象是可以直接 ...

  3. mysql一张表多个字段关联另一张表查询

    如下:一张订单表多个字段关联用户表: 1.链表查询 SELECT cu.id AS 'id',cu.version AS 'version',cu.cid AS 'cid',cu.uid AS 'ui ...

  4. qlikview 权限管理和sso集成

    简单总结一下 qlikview 权限管理和SSO集成的过程, 在集成qlikview报表过程中碰到了很多坑, 甚至官方文档也不准确.  如果你也有类似的需求, 可以参考一下本文.  需要说明的是, 本 ...

  5. extjs.net 按钮执行并显示Mask代码

    <ext:Button ID="ButtonTest" runat="server"  Width="65" Text="同 ...

  6. 快速学习 javascript

    // js 6种数据类型:字符串.数值.布尔值.undefined.null.object // 三种非数字的数字类型:Infinity -Infinity NaN var str = "H ...

  7. bootstrap table 冻结列 ie 兼容

    修改前: Chrome效果 Ie11效果 修改后: Ie11效果 修改bootstrap-table-fixed-columns.js文件 修改其中的initBody方法 修改为

  8. 单片机AT和STC区别

    http://www.21ic.com/jichuzhishi/datasheet/AT89C51/data/192017.html

  9. Angular4

    1.安装node.js 官网下载安装 npm会跟着被自动安装 2.安装Angular工具(AngularCli) 1.使用npm安装 npm install -g @angular/cli 2使用cn ...

  10. SqlServer_存储过程

    1.查询全部数据 create proc stu1 as begin select * from Students end go exec stu1 2.根据姓名查询信息 --存储过程内部自带值cre ...