传送门

推式子(快哭了……)$$s^2*m^2=\sum _{i=1}^m (x_i-\bar{x})^2$$

$$s^2*m^2=m*\sum _{i=1}^m x_i^2-2*sum_n\sum _{i=1}^m x_i+sum_n^2$$

$$s^2*m^2=m*\sum _{i=1}^m x_i^2+(sum_n-\sum _{i=1}^m x_i)^2-(\sum _{i=1}^m x_i)^2$$

然后因为$sum_n$和$\sum _{i=1}^m x_i$两项是定值,且值相等,所以$$s^2*m^2=m*\sum _{i=1}^m x_i^2-(\sum _{i=1}^m x_i)^2$$

我们发现$(\sum _{i=1}^m x_i)^2$是一个定值,那么我们的目的就是让$\sum _{i=1}^m x_i^2$最小

总算扯到dp上了不容易啊……

我们设$dp[i][l]$表示前$i$条路$l$天走,最小的\sum _{a=1}^i x_a^2是多少,那么有如下的状态转移方程$$dp[i][l]=min\{dp[j][l-1]+(sum[i]-sum[j])^2\}$$

然后考虑斜率优化(以下省略$l$这一维)

假设$j$比$k$更优,则有$$dp[j]+(sum[i]-sum[j])^2<dp[k]+(sum[i]-sum[k])^2$$

展开,移项$$dp[j]+sum[j]^2-dp[k]-sum[k]^2<2*sum[i]*sum[j]-2*sum[i]*sum[k]$$

$$\frac{dp[j]+sum[j]^2-dp[k]-sum[k]^2}{sum[j]-sum[k]}<2*sum[i]$$

然后就可以上斜率优化了

ps:注意当$l$为$0$的时候dp要都初始化为$sum[i]^2$

 //minamoto
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=;
ll sum[N],sp[N],dp[N];int n,m,h,t,q[N],r;
inline ll Y(int i){return sp[i]+sum[i]*sum[i];}
inline double slope(int j,int k){
return (Y(j)-Y(k))*1.0/(sum[j]-sum[k]);
}
int main(){
//freopen("testdata.in","r",stdin);
n=read(),m=read();
for(int i=;i<=n;++i)
sum[i]=read()+sum[i-],sp[i]=sum[i]*sum[i];
for(int a=;a<m;++a){
h=t=;q[]=a;
for(int i=a+;i<=n;++i){
while(h<t&&slope(q[h],q[h+])<*sum[i]) ++h;
dp[i]=sp[q[h]]+(sum[i]-sum[q[h]])*(sum[i]-sum[q[h]]);
while(h<t&&slope(q[t],q[t-])>slope(q[t-],i)) --t;q[++t]=i;
}
for(int i=;i<=n;++i) sp[i]=dp[i];
}
printf("%lld\n",-sum[n]*sum[n]+m*dp[n]);
return ;
}

洛谷P4072 [SDOI2016]征途(斜率优化)的更多相关文章

  1. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

  2. 洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)

    洛谷题目传送门 一开始肯定要把题目要求的式子给写出来 我们知道方差的公式\(s^2=\frac{\sum\limits_{i=1}^{m}(x_i-\overline x)^2}{m}\) 题目要乘\ ...

  3. [洛谷P4072] SDOI2016 征途

    问题描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...

  4. 洛谷4072 SDOI2016征途 (斜率优化+dp)

    首先根据题目中给的要求,推一下方差的柿子. \[v\times m^2 = m\times \sum x^2 - 2 \times sum \times sum +sum*sum \] 所以\(ans ...

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

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

  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. 【BZOJ4518】[Sdoi2016]征途 斜率优化

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

  9. 【bzoj4518】[Sdoi2016]征途 斜率优化dp

    原文地址:http://www.cnblogs.com/GXZlegend/p/6812435.html 题目描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界 ...

随机推荐

  1. linux 学习2 常用命令

    1.显示日期的指令: date 2.   [Tab]按键---具有『命令补全』不『档案补齐』的功能 3:  su和 sudo  su用于用户之间的切换.  su在不加任何参数,默认为切换到root用户 ...

  2. laravel4 composer报错 d11wtq/boris v1.0.10 requires ext-pcntl

    laravel4 composer报错 d11wtq/boris v1.0.10 requires ext-pcntl laravel 4.2 用composer 安装任何包都会报这个错,通过谷歌找到 ...

  3. Less known Solaris features: svccfg editprop (ZT)

    http://www.c0t0d0s0.org/archives/7675-Less-known-Solaris-features-svccfg-editprop.html Sometimes sma ...

  4. java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest

    转自:https://blog.csdn.net/iteye_17476/article/details/82651580 java.lang.ClassCastException: org.apac ...

  5. SQL 实现行列互换

    Oracle:不过大多数是采用 oracle 数据库当中的一些便捷函数进行处理,比如 ”pivot”: MySql:目前没有找到更好的方法 题目:数据库中有一张如下所示的表,表名为sales. 年 季 ...

  6. NDK 编译报错:request for member 'FindClass' in something not a structure or union

    ndk编译 xx.c文件时一直报下面的错误: ”request for member 'FindClass' in something not a structure or union ...” 原因 ...

  7. 通过Excel导入Mysql 超过65535条数据的办法

    1.截取 65534条数据,进行分sheet,然后1个sheet导入一张表,最后进行整合! 2.采用TXT导入方式,TXT的导入暂时没发现限制的数据条数,下午用TXT导入74万条数据成功 3.如果遇到 ...

  8. android中音频播放的两种方法

    方法1.通过MediaPlayer播放,可播放本地,网络音频,适合播放单个文件 方法2.通过SoundPool,适合播放多个文件 详见:http://www.cnblogs.com/xiaoQLu/a ...

  9. CentOS 7 下设置DNS

    在CentOS 7下,手工设置 /etc/resolv.conf 里的DNS,过了一会,发现被系统重新覆盖或者清除了.和CentOS 6下的设置DNS方法不同,有几种方式: 1.使用全新的命令行工具 ...

  10. Arduino Wire.h(IIC)库函数详解

    此库中包含 1 Wire.begin() 2 Wire.requestFrom() 3 Wire.beginTransmission() 4 Wire.endTransmission() 5 Wire ...