题目

洛谷 & 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. H5新属性FileReader实现选择图片后立即显示在页面上

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. MVC Repository模式

    近来发现很多ASP.NET MVC的例子中都使用了Repository模式,比如Oxite,ScottGu最近发布的免费的ASP.NET MVC教程都使用了该模式.就简单看了下. 在<企业架构模 ...

  3. Kettle系列: 马进举开源的Kettle通用插件 KettleEasyExpand

    扩展Kettle功能, 经常使用 user defined java class 组件, 或者自己开发Java插件. 两种方式都有各自的痛点: 1. 在user defined java class ...

  4. new

    Android支持插件库,可以是由C/C++开发的JNI形式,也可以是由java代码开发的jar形式(也可以是android封包完成的apk文件).加载jar插件的方式可以分为 1.静态加载2.动态加 ...

  5. luogu 1640 连续攻击游戏

    二分图匹配,将需要进行的编号(1-10000)和物件进行匹配,而非编号之间,编号对应物品 #include<bits/stdc++.h> using namespace std; ; ; ...

  6. 【noip 2011】提高组Day1T3.Mayan游戏

    Description Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是 ...

  7. java基础_0204:运算符

    掌握Java中标识符的定义: 掌握Java中数据类型的划分以及基本数据类型的使用原则: 掌握Java运算符的使用: 掌握Java分支结构.循环结构.循环控制语法的使用: 掌握方法的定义结构以及方法重载 ...

  8. js开发模式

    js中的开发模式进化史: js中有最初的只能由基本数据类型描述——>单例模式-->工厂模式-->构造函数模式-->原型模式-->各个模式相结合的混合模式,下面我会给大家逐 ...

  9. 【数据表格】datatable+SpringMVC+Spring Data JPA

    初步实现 $("#userTable").dataTable({ "processing": true, "serverSide": tru ...

  10. 🍓 react16.2新特性 🍓

    react16.2新特性:组件中可以一次性return 多个子元素(子组件)了,也就是说,想return多个子元素,不用在外面包一个父盒子了. 方法一:把要return的元素放在一个空的jsx里面 方 ...