题目大意

​ 给你一个序列, 将这个序列分成若干段, 每一段的贡献为 \(ax ^ 2 + bx + c\)(x 为 这一段的权值之和)

具体思路


50pts

​ 考虑Dp, 设$Dp_i$为前i个数分成若干段的最大收益, 则$Dp[i] = max(Dp[j-1] + Cost_{i,j})\quad(j ​ 现在想\(cost\) 函数怎么求得

​ 设\(Sum[i]\) 为 i 的前缀和, 则\(cost_{i, j} = a(Sum[i] - Sum[j]) ^ 2 + b (Sum[i] - Sum[j-1]) + c\) 可以\(O(1)\) 求得

100pts

​ 想一想如何优化这个转移, 发现j每次都是从1 至 n , 考虑进行斜率优化

​ 不妨设 x > y 且 x的转移优于y

​ 则\(Dp[x] + a(Sum[i] - Sum[x]) ^ 2 + b (Sum[i] - Sum[x]) + c > Dp[y]+ a(Sum[i] - Sum[y]) ^ 2 + b (Sum[i] - Sum[y]) + c\)

\(\Leftrightarrow Dp[i] + a(Sum[i] ^ 2 + Sum[x] ^ 2 - 2 * Sum[i] * Sum[x]) + b(Sum[i] - Sum[x]) + c > Dp[y] + a(Sum[i] ^ 2 + Sum[y] ^ 2 - 2 * Sum[i] * Sum[x]) + b(Sum[i] - Sum[y]) + c\)

\(\Leftrightarrow Dp[i] + aSum[i] ^ 2 + aSum[x] ^ 2 - 2 * a * Sum[i] * Sum[x] + b Sum[i] - bSum[x ] + c > Dp[y] + a * Sum[y] ^ 2 + a * Sum[y] ^ 2 - 2aSum[i] * Sum[x] + bSum[i] - bSum[y] + c\)

移项、合并同类项得

​ \(Dp[x] - Dp[y] + a(Sum[x ] ^ 2 - Sum[y] ^ 2) - b(Sum[x] - Sum[y]) > 2aSum[i](Sum[x] - Sum[y])\)

\(\Leftrightarrow \frac{Dp[x] - Dp[y] + a(Sun[x] ^ 2 - Sum[y] ^ 2) - b(Sum[x] - Sum[y])}{(Sum[x] - Sum[y])} > 2aSum[i]​\)

\(\Leftrightarrow \frac{Dp[x] + aSum[x] ^ 2 + bSum[x] - Dp[y] - aSum[y]^2 - bSum[y]}{(Sum[x] - Sum[y])} > 2aSum[i]\)

​ 注意:由于题面说\(a < 0 ​\) 所以如果要将a除过去要将符号转向

不难发现左式为一个直线的点斜式,故令其为Slope(x, y) 要满足决策单调性即Slope满足单调性, 用单调队列维护即可

代码实现

#pragma GCC optimize("O2")
#pragma GCC optimize("O3") #include <cstdio> template<class T>
inline void read(T &a){
T s = 0, w = 1;
char c = getchar();
while(c < '0' || c > '9') {if(c == '-') w = -1; c = getchar();}
while(c >= '0' && c <= '9') {s = (s << 1) + (s << 3) + (c ^ 48), c = getchar();}
a = s * w;
} #define maxn 1000010
static int n,s[maxn],l,r,q[maxn];
static long long a,b,c,dp[maxn]; #define A(x) (dp[x] + a * s[x] * s[x] - b * s[x])
#define P(x) (s[i] - s[x]) inline double slope(register int x, register int y){
return 1.0 * (A(x) - A(y)) / ((s[x] - s[y]));
} signed main(){
read(n), read(a), read(b), read(c);
for (register int i = 1; i <= n; i++){
int x;
read(x);
s[i] = s[i-1] + x;
} for (register int i = 1; i <= n; i++){
while(l < r && slope(q[l + 1], q[l]) > 2*a*s[i]) l++;
dp[i] = dp[q[l]] + a * P(q[l]) * P(q[l]) + b * P(q[l]) + c;
while(l < r && slope(q[r], q[r-1]) < slope(i, q[r])) r--;
q[++r] = i;
}
printf("%lld", dp[n]);
return 0;
}

题解 P3628 【[APIO2010]特别行动队 】的更多相关文章

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

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

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

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

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

  4. P3628 [APIO2010]特别行动队

    \(\color{#0066ff}{ 题目描述 }\) 你有一支由 \(n\) 名预备役士兵组成的部队,士兵从 \(1\) 到 \(n\) 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑 ...

  5. 洛谷P3628 [APIO2010]特别行动队(动态规划,斜率优化,单调队列)

    洛谷题目传送门 安利蒟蒻斜率优化总结 由于人是每次都是连续一段一段地选,所以考虑直接对\(x\)记前缀和,设现在的\(x_i=\)原来的\(\sum\limits_{j=1}^ix_i\). 设\(f ...

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

    题意简述 将n个士兵分为若干组,每组连续,编号为i的士兵战斗力为xi 若i~j士兵为一组,该组初始战斗力为\( s = \sum\limits_{k = i}^{j}xk \),实际战斗力\(a * ...

  7. 【题解】[APIO2010]特别行动队

    Link 题目大意:一段区间的贡献是\(ax^2+bx+c,x=\sum v\),求一个划分让总区间的价值最大.分段必须连续. \(\text{Solution:}\) 设计\(dp[i]\)表示前\ ...

  8. 洛谷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 ...

  9. 洛谷P3628 [APIO2010]特别行动队 斜率优化

    裸题,注意队列下标不要写错 Code: #include<cstdio> #include<algorithm> #include<cmath> using nam ...

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

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

随机推荐

  1. div浮停在页面最上或最下

    div{ position:fixed; bottom:0px; // top:0px; z-index:999; } bottom:0px 浮停在最下面,top:0px 浮停在最上面:z-index ...

  2. Android无线调试(转)

    Android无线调试——抛开USB数据线 开发Android的朋友都知道,真机调试需要把手机与PC相连,然后把应用部署到真机上进行安装和调试.长长的USB线显得很麻烦,而且如果需要USB接口与其他设 ...

  3. 乞丐版servlet容器第4篇

    6. NIOConnector 现在为Server添加NIOConnector,添加之前可以发现我们的代码其实是有问题的.比如现在的代码是无法让服务器支持同时监听多个端口和IP的,如同时监听 127. ...

  4. 2018.07.10 NOIP模拟 sort(单调队列)

    Sort 题目背景 SOURCE:NOIP2016-RZZ-4 T1 题目描述 给你一个长度为 n 的排列,小W每次可以选择一个数,做以下操作: 不断把这个数与它右边的数交换. 当它右边没有数,或它右 ...

  5. yii2 HTML组手

    1.样式和脚本 1.1 Yii 提供两个方法用于生成包含内联样式和脚本代码的标签. <?= Html::style('.danger { color: #f00; }') ?> Gives ...

  6. 日历时间选择控件---3(支持ie、火狐)

    效果展示:  源代码: <script language=javascript ><!--/* 调用方法:不能用onfocus,要用onclick  <input onclic ...

  7. CentOS7查看网络的相关命令

    转载自:https://www.linuxidc.com/Linux/2015-07/119555.htm 1.切换到超级用户 [Oscar@localhost 桌面]$ su root 2.查询可用 ...

  8. Spring 获取资源文件路径

    import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; s ...

  9. iOS的block内存管理

    初始情况下: block本身.__block修饰的变量以及在block内部使用的变量都是在栈里的. __block修饰的变量的地址会作为实参传入block块内部(暂时先这么理解,实际比较复杂).blo ...

  10. 池建强 博客 Mac使用技巧 第一季

    第1天: 今天推送的Mac技巧: 使用OS X,我们可以充分利用系统提供的多个Space,把不同的程序放到不同的Space,让我们的系统更有扩展性.如何增加Space呢?四指上推,在桌面的最上方会出现 ...