Link

题目大意:给定序列,将它划分为\(m\)段使得方差最小,输出\(s^2*m^2\)(一个整数)。

\(\text{Solution:}\)

这题我通过题解中的大佬博客学到了一般化方差柿子的写法。

下面来推柿子:

\[s^2=\frac{\sum_{i=1}^n (x_i-\overline{x})^2}{n}=\frac{1}{n}(\sum_{i=1}^n x_i^2+n*(\frac{ \sum_{i=1}^n x_i}{n})^2-2\sum_{i=1}^n (x_i* \frac{\sum_{k=1}^n x_k}{n}))
\]
\[s^2=\frac{\sum_{i=1}^n x_i^2+\frac{(\sum_{i=1}^n x_i)^2}{n}-2 \frac{(\sum_{k=1}^n x_i)^2}{n}}{n}
\]

化简得到:

\[s^2=\frac{(x_1^2+...+x_n^2)-\frac{(\sum_{i=1}^n x_i)^2}{n}}{n}
\]

两边乘以\(n^2\)得到:

\[s^2n^2=n\sum_{i=1}^n x_i^2 -(\sum_{i=1}^n x_i)^2=n\sum_{i=1}^n x_i^2 -sum[n]^2
\]

其中\(sum\)是前缀和。最后这个柿子里面,\(n,sum\)都是常数,最终要处理的就是\(\sum_{i=1}^n x_i^2\).

设\(dp[i][l]\)表示前\(i\)个元素划分\(l\)次的最小平方和,有:

\[dp[i][l]=\min_{j<i}dp[j][l-1]+(sum[i]-sum[j])^2
\]
\[dp[i][l]=dp[j][l-1]+sum[i]^2+sum[j]^2-2sum[i]sum[j]
\]
\[dp[j][l-1]+sum[j]^2=2sum[i]sum[j]+dp[i][l]-sum[i]^2
\]
\[y=dp[j][l-1]+sum[j]^2,k=2sum[i],x=sum[j],b=dp[i][l]-sum[i]^2
\]

最终目的最小化\(dp[i][l]\)这里就是最小化\(b\),观察到\(2sum[i]\)这个斜率单调递增,所以我们维护所有大于这个斜率的决策点,做到\(O(n).\)

对于这个题,还可以滚动数组优化,虽然这里不需要。

几个实现细节:前\(i\)个元素可以划分成\(i\)段,所以每次枚举起点,它的决策起点应该是划分段数\(-1\),开始应该是划分段数对应的元素数。因为再往前往后都会导致不合法。

写\(\text{slope}\)的时候最好用\(\text{long double}\).顺序不要搞反。当然这个题主要难点是推方差柿子……\(\text{WCSL.}\)

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,a[20010],sum[20010];
int dp[4000][4000],tail,head;
int q[200010];
int X(int x){return sum[x];}
int Y(int x,int p){return dp[x][p-1]+sum[x]*sum[x];}
long double slope(int x,int y,int p){return (long double)(Y(y,p)-Y(x,p))/(X(y)-X(x));}
//dp[i][l]=dp[j][l-1]+(sum[i]-sum[j])^2
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i],dp[i][1]=sum[i]*sum[i];
for(int p=2;p<=m;p++){
head=tail=1;
q[head]=p-1;
for(int i=p;i<=n;++i){
while(head<tail&&slope(q[head],q[head+1],p)<2.0*sum[i])head++;
dp[i][p]=dp[q[head]][p-1]+(sum[i]-sum[q[head]])*(sum[i]-sum[q[head]]);
while(head<tail&&slope(q[tail-1],q[tail],p)>slope(q[tail-1],i,p))tail--;
q[++tail]=i;
}
}
printf("%lld\n",m*dp[n][m]-sum[n]*sum[n]);
return 0;
}

附上推柿子时\(\text{word}\)上的东西:

\(Dp[i][l]=dp[j][l-1]+(sum[i]-sum[j])^2\)

\(Dp[i]][l]=dp[j][l-1]+sum[i]^2+sum[j]^2-2sum[i]sum[j]\)

\(Dp[j][l-1]+sum[j]^2=2sum[i]sum[j]+dp[i][l]-sum[i]^2\)

\(Y=dp[j][l-1]+sum[j]^2,k=2sum[i],x=sum[j],b=dp[i][l]-sum[i]^2\)

最小化\(b\),即可

\(Ans=-sum[n]^2+m*dp[n][m]\)

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

  1. 题解-[SDOI2016]征途

    [SDOI2016]征途 [SDOI2016]征途 给定长度为 \(n\) 的序列 \(a\{n\}\),将其分为连续 \(m\) 段,和分别为 \(v\{m\}\).\(v\{m\}\) 的方差为 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. luoguP4072 [SDOI2016]征途

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

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

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

随机推荐

  1. webpack打包初始入门教程

    Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 从图中我们可以看出,Webpack 可以将多种静态资源 js.css ...

  2. Android开发之java代码工具类。判断当前网络是否连接并请求下载图片

    package cc.jiusan.www.utils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; ...

  3. 深入理解计算机系统 Start && 第一章要点

    对此书已经慕名已久了,抽空看了第1,2,3,5章,其他章节等有空闲继续看吧. 我的许多博客是给自己快速复习使用的,比如此读书后感,你可以根据我下面的建议读完原书几章再回来复习一下(或许那时候就没必要回 ...

  4. 关于js重名方法的先后调用问题

    当js中方法重名时,最后引入的js会覆盖前面的引入的js(就是说会调用最后引入的js中的方法)详情参照(main.js与white.js 的a())但是,当最后一个js中存在语法上的错误时(也可以是本 ...

  5. Google Code Jam 2020 Round1B Expogo

    题意 你初始位于\((0,0)\),然后你想要到\((x,y)\)去,第\(i\)步的步长是\(2^{i-1}\),要求用最少的步数走到\((x,y)\). 解题思路 首先可以推出,走\(i\)步可以 ...

  6. oracle 11G R2卸载说明

    oracle 11G R2数据库卸载

  7. python实践项目1

    python #南昌理工学院人工智能学院实验室 WORKSHOP 实践项目 import time print('welcome to our WORKSHOP') print('.......... ...

  8. 执行Python程序出现“SyntaxError: Non-UTF-8 code starting with '\xb6'...”错误怎么办?

    如果文件中有中文,直接执行python xx.py会出现以下错误: SyntaxError: Non-UTF- code starting with '\xb6' in file XX.py on l ...

  9. Nginx及其架构设计

    1.1. 什么是 Nginx Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个 IMAP/P ...

  10. SpringBoot2 集成日志,复杂业务下的自定义实现

    本文源码:GitHub·点这里 || GitEE·点这里 一.日志体系集成 1.日志管理 在系统的开发中,最关键的一个组件工具就是日志,日志打印方便问题排查,或者生产事故回溯,日志记录用来监控并分析系 ...