[SDOI2016]征途

[SDOI2016]征途

给定长度为 \(n\) 的序列 \(a\{n\}\),将其分为连续 \(m\) 段,和分别为 \(v\{m\}\)。\(v\{m\}\) 的方差为 \(E\),求 \(\left(m^2\times E\right)_{\min}\)。

\(1\le n\le 3000\),\(1\le \sum a_i\le 30000\)。


复习斜率优化第一题,遇到好多麻烦,写一篇题解记录。


首先推式探索 \(m^2\times E\) 的本质:

设 \(sum=\sum a_i=\sum v_i\)。

\[\begin{split}
m^2\times E=&m^2\times \frac{\sum\limits_{i=1}^m\left(v_i-\frac{sum}{m}\right)^2}{m}\\
=&m \sum\limits_{i=1}^m\left(v_i-\frac{sum}{m}\right)^2\\
=&m \left(\sum\limits_{i=1}^mv_i^2-\sum\limits_{i=1}^m2v_i\cdot\frac{sum}{m}+\sum\limits_{i=1}^m\frac{sum^2}{m^2}\right)\\
=&m \left(\sum\limits_{i=1}^mv_i^2-2sum\cdot\frac{sum}{m}+m\cdot\frac{sum^2}{m^2}\right)\\
=&m \left(\sum\limits_{i=1}^mv_i^2-2\cdot\frac{sum^2}{m}+\frac{sum^2}{m}\right)\\
=&m \left(\sum\limits_{i=1}^mv_i^2-\frac{sum^2}{m}\right)\\
=&m \sum\limits_{i=1}^mv_i^2-sum^2\\
\end{split}
\]

很明显 \(-sum^2\) 是定值,所以要求 \(\left(m^2\times E\right)_{\min}\),应该先求 \(\left(\sum\limits_{i=1}^mv_i^2\right)_{\min}\)。


考虑到 \(n\) 很迷你,可以 \(\texttt{dp}\)。

\(F_{t,i}\) 表示前 \(t\) 段包含 \(a_1\sim a_i\) 的 \(\left(\sum\limits_{h=1}^tv_h^2\right)_{\min}\)。

假设 \(v_t=\sum_{h=j+1}^ia_h\)。

可以有递推式:

\[F_{t,i}=\min\{F_{t-1,j}+v_t^2\}=\min\{F_{t-1,j}+\left(\sum_{h=j+1}^ia_h\right)^2\}(j\le i)
\]

如果 \(s_i=\sum\limits_{h=1}^ia_h\),用 \(f\) 表示 \(F_t\),用 \(g\) 表示 \(F_{t-1}\),那么上式变为:

\[f_i=\min\{g_j+(s_i-s_j)^2\}(j\le i)
\]

考虑 \(j=k\) 比 \(j=t\) 更优的情况:

\[\begin{split}
g_k+(s_i-s_k)^2<& g_t+(s_i-s_t)^2\\
g_k+s_i^2-2s_is_k+s_k^2<& g_t+s_i^2-2s_is_t+s_t^2\\
g_k-2s_is_k+s_k^2<& g_t-2s_is_t+s_t^2\\
(g_k+s_k^2)-(g_t+s_t^2)<& 2s_is_k-2s_is_t\\
\frac{(g_k+s_k^2)-(g_t+s_t^2)}{s_k-s_t}<& 2s_i
\end{split}
\]

然后老套路,把 \((g_j,g_j+s_j^2)\) 当做点,单调队列维护一个下凸壳,实现 \(\texttt{dp}\)。

re int l,r; re vector<int> q(n+7);
for(re int i=1;i<=n;i++) dp[1][i]=p2(sm[i]);
for(re int t=2;t<=m;t++){
f=dp[t&1],g=dp[(t&1)^1],l=1,r=0,q[++r]=0; //奇淫技巧①:用指针 f,g 来定位滚动数组
for(re int i=1;i<=n;i++){
while(l<r&&slope(q[l],q[l+1])<=2.0*sm[i]) l++;
//奇淫技巧②:取min维护下凸壳,用<=,取max维护上凸壳,用>=
f[i]=g[q[l]]+p2(sm[i]-sm[q[l]]);
while(l<r&&slope(q[r-1],q[r])>=slope(q[r],i)) r--; //奇淫技巧③:递推前后两句话用不同比较符号
q[++r]=i;
}
}

最后的答案就是 \(m\cdot f_n-sum^2\)。


时间复杂度 \(\Theta(mn)\),空间复杂度 \(\Theta(n)\)。


Code

#include <bits/stdc++.h>
using namespace std; //Start
#define re register
#define il inline
#define mk make_pair
#define pb push_back
#define db double
#define lng long long
#define fi first
#define se second
const int inf=0x3f3f3f3f;
const lng INF=0x3f3f3f3f3f3f3f3f; //Data
const int N=3000; /* dp[i][j]:i-th day ***/
int n,m,dp[2][N+7],*f,*g; /** j-th section **/
vector<int> a,sm; /*** val min sum()^2 */ //DP
template<typename T>il T p2(re T x){return x*x;}
il db slope(re int x,re int y){ //斜率函数用double
return 1.0*((g[x]+p2(sm[x]))-(g[y]+p2(sm[y])))/(sm[x]-sm[y]);
}
il int DP(){
re int l,r; re vector<int> q(n+7);
for(re int i=1;i<=n;i++) dp[1][i]=p2(sm[i]);
for(re int t=2;t<=m;t++){
f=dp[t&1],g=dp[(t&1)^1],l=1,r=0,q[++r]=0;
for(re int i=1;i<=n;i++){
while(l<r&&slope(q[l],q[l+1])<=2.0*sm[i]) l++;
f[i]=g[q[l]]+p2(sm[i]-sm[q[l]]);
while(l<r&&slope(q[r-1],q[r])>=slope(q[r],i)) r--;
q[++r]=i;
}
}
return f[n];
} //Main
int main(){
scanf("%d%d",&n,&m),a=sm=vector<int>(n+7);
for(re int i=1;i<=n;i++) scanf("%d",&a[i]),sm[i]=sm[i-1]+a[i];
printf("%d\n",m*DP()-p2(sm[n])); //别忘了求最终答案啊
return 0;
}

祝大家学习愉快!

题解-[SDOI2016]征途的更多相关文章

  1. 斜率优化入门学习+总结 Apio2011特别行动队&Apio2014序列分割&HZOI2008玩具装箱&ZJOI2007仓库建设&小P的牧场&防御准备&Sdoi2016征途

    斜率优化: 额...这是篇7个题的题解... 首先说说斜率优化是个啥,额... f[i]=min(f[j]+xxxx(i,j)) ;   1<=j<i (O(n^2)暴力)这样一个式子,首 ...

  2. 【BZOJ4518】[Sdoi2016]征途 斜率优化

    [BZOJ4518][Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除 ...

  3. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  4. 动态规划(决策单调优化):BZOJ 4518 [Sdoi2016]征途

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 532  Solved: 337[Submit][Status][ ...

  5. BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]

    4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...

  6. bzoj4518[Sdoi2016]征途 斜率优化dp

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1657  Solved: 915[Submit][Status] ...

  7. BZOJ_4518_[Sdoi2016]征途_斜率优化

    BZOJ_4518_[Sdoi2016]征途_斜率优化 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到 ...

  8. luoguP4072 [SDOI2016]征途

    [SDOI2016]征途 大体 大概就是推推公式,发现很傻逼的\(n^3\)DP get60 进一步我们发现状态不能入手,考虑优化转移 套个斜率优化板子 每一层转移来一次斜率优化 思路 先便便式子 \ ...

  9. BZOJ4518 Sdoi2016 征途 【斜率优化DP】 *

    BZOJ4518 Sdoi2016 征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m ...

随机推荐

  1. 死磕以太坊源码分析之Kademlia算法

    死磕以太坊源码分析之Kademlia算法 KAD 算法概述 Kademlia是一种点对点分布式哈希表(DHT),它在容易出错的环境中也具有可证明的一致性和性能.使用一种基于异或指标的拓扑结构来路由查询 ...

  2. 云服务器-Ubuntu更新系统版本-更新Linux内核-服务器安全配置优化-防反弹shell

    购入了一台阿里云的ESC服务器,以前都用CentOS感觉Yum不怎么方便,这次选的Ubuntu16.04.7 搭好服务之后做安全检查,发现Ubuntu16.04版本漏洞众多:虽然也没有涉及到16.04 ...

  3. java开发两年,连Spring的依赖注入的方式都搞不清楚,你工作可能有点悬!

    Spring依赖注入 常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的 ...

  4. 阿里技术专家深入讲解,SpringMVC入门到进阶,看这一篇就够了

    前言 SpringMVC是一个实现了Web MVC设计模式的轻量级Web框架.它与前辈Struts 2框架一样,都属于MVC框架,因为其使用和性能等方面比Struts 2更加优异,所以Spring M ...

  5. 如何用Vegas完成视频编辑中的自动跟踪换图

    Vegas作为一款专业的视频剪辑软件,剪辑速度快捷,拥有各种实用工具和特效,同样也可以为用户实现视频换图的需求.今天小编就为大家讲解,如何利用Vegas自动跟踪进行换图,让视频能够更加便捷的呈现. 本 ...

  6. FL Studio里一起安装的ASIO4ALL有什么用?

    在我们安装FL Studio时,正常情况下我们安装FL Studio时最多也就改改安装目录,其他的安装设置一般不会动,但看到FL安装的那些东西我们难道不会感到好奇吗?FL Studio安装包括FL S ...

  7. 25. K 个一组翻转链表

    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.示例 :给定这个链表: ...

  8. web服务器是啥

    什么是web服务器 参考 https://www.cnblogs.com/zhaoyl/archive/2012/10/10/2718575.html 了解nginx之前,先了解下什么是web服务器吧 ...

  9. Eclipse改字体大小

    Windows ->Perferences ->General ->Appearance ->Colors and Fonts ->Basic ->Text Fon ...

  10. k8s集群部署rabbitmq集群

    1.构建rabbitmq镜像 RabbitMQ提供了一个Autocluster插件,可以自动创建RabbitMQ集群.下面我们将基于RabbitMQ的官方docker镜像,添加这个autocluste ...