题目

洛谷 & 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. python django基础二URL路由系统

    URL配置 基本格式 from django.conf.urls import url #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数 ...

  2. Hadoop记录-fair公平调度队列管理

    <?xml version="1.0"?> <allocations> <queue name="root"> <qu ...

  3. python爬虫慕课基础2

    实战演练:爬取百度百科1000个页面的数据 对于新手来说,可以把spider_main.py代码中的try和except去掉,运行报错就会在控制台出现,根据错误去调试自己的程序 发现以下错误: req ...

  4. Doker安装日志,留个记录而已

    tianye@ubuntu:/usr/share$ wget -qO- https://get.docker.com/ | sh # Executing docker install script, ...

  5. java的TCP和UDP编程

    TCP 客户端: import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter ...

  6. HanLP中人名识别分析

    HanLP中人名识别分析 在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: 名字识别的问题 #387 机构名识别错误 关 ...

  7. Ubuntu Server Download

    点击查看所有版本(中国站点) http://mirror.lzu.edu.cn/ubuntu-releases/

  8. Nginx不支持Post数据中带有"."

    如果提交的数据中带有.,nginx会把数据过滤掉,会导致后台收不到数据.下面是一个错误示例及解决办法

  9. Java8新特性_接口中的默认方法

    默认方法由来猜想 1. Collection接口.Collections公共类.  同是操作集合,为啥要搞俩?没必要.在接口中搞一些默认实现,一个接口即搞定了. 2. Java8支持Lambda表达式 ...

  10. 关于JDBC技术中,调用MySQL中不建议在没有服务器身份验证的情况下建立SSL连接错误解决

    今天学习到了JBDC前沿:对JDBC编写步骤的封装,出现了一大串红色报错(当然,也不能叫报错,毕竟不是所有的红色都是错误eeror,) 错误如下: Establishing SSL connectio ...