Description

Pine开始了从S地到T地的征途。

从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。

Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。

Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。

帮助Pine求出最小方差是多少。

设方差是v,可以证明,v×m2是一个整数。为了避免精度误差,输出结果时输出v×m2。

Input

第一行两个数 n、m。

第二行 n 个数,表示 n 段路的长度

Output

一个数,最小方差乘以 m^2 后的值

Sample Input

5 2

1 2 5 8 6

Sample Output

36

HINT

1≤n≤3000,保证从 S 到 T 的总路程不超过 30000


方差公式

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

再乘上\(m^2\)

\[\sum_{i=1}^m[m\times (x_i-\frac{sum}{m})^2]$$画柿子就是

$$m\times \sum_{i=1}^m x^2 -sum^2\]

由于第二项是确定的,所以只需要最小化第一项

继续拆

\[m\times \sum_{i=1}^na_i^2+2\times m\times\sum _{k=1}^m \sum_{i=x_{kl}}^{x_{kr}-1}\sum_{j=i+1}^{x_{kr}}a_i\times a_j
\]

第一项又变成定值,最小化第二项

用\(s[i]\)表示前缀和,\(d[k]\)表示$$\sum_{i=1}k\sum_{j=i+1}ka_i\times a_j$$

那么表示上个柿子第二项就是$$d[r]-d[l]-(s[r]-s[l])\times s[l]$$

然后就可以斜率优化啦!当决策\(l\)比\(k\)优就是

\[s[i]>\frac{(d_l-s_l^2-f_l)-(d_k-s_k^2-f_k)}{s_k-s_l}
\]

\(f_x\)表示的是转移向的代价


#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define M 3001
#define X(i,k) (d[i]-s[i]*s[i]-f[k][i])
#define xl(x,y,k) ((double)X(x,k)*1.0-(double)X(y,k)*1.0)/((double)s[y]*1.0-1.0*s[x])
#define LL int
LL i,m,n,j,k,a[M],s[M],f[2][M],d[M],sum,q[2][M],tt,top,tail,head; int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s[i]=s[i-1]+a[i];
d[i]=d[i-1]+a[i]*s[i-1];
sum+=a[i]*a[i];
}
for(i=1;i<=m;i++)
{
tail=top; head=1;
tt=top=0;
int u=i&1;
for(j=i;j<=n;j++)
{
while(q[!u][head]+1<j && head<tail-1 && xl(q[!u][head+1],q[!u][head],!u)<1.0*s[j]) head+=1;
int x=q[!u][head];
f[u][j]=d[j]-d[x]-(s[j]-s[x])*s[x]+f[!u][x];
while(top>tt+1 && xl(q[u][top],q[u][top-1],u)>xl(j,q[u][top],u)) top-=1;
q[u][++top]=j;
}
}
printf("%d",2*f[m&1][n]*m-s[n]*s[n]+sum*m);
}

4518: [Sdoi2016]征途的更多相关文章

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

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

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

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

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

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

  4. BZOJ 4518 [Sdoi2016]征途(分治DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4518 [题目大意] 给出一个数列,分成m段,求方差最小,答案乘上m的平方. [题解] ...

  5. ●BZOJ 4518 [Sdoi2016]征途

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4518 题解: 斜率优化DP 首先看看最后答案的形式: 设a[i]为第i天走的距离,那么 $A ...

  6. bzoj 4518: [Sdoi2016]征途

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

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

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

随机推荐

  1. Freemarker详解一

    1 截取字符串有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的例子就可以自定义显示的长度<#if title.content?length lt 8>        ...

  2. day_02mysql表的约束设计

    首先我们复习第一天的主要内容: sql分类 知识概述 1) DDL(Data Definition Language)数据定义语言 用来定义数据库对象:数据库,表,列等.关键字:create, dro ...

  3. properties配置文件编码问题

    properties配置文件编码问题 person.last-name=哈哈 person.age=18 person.bitrh=2019/01/12 person.boss=false perso ...

  4. Builder 设计模式的学习

    Buileder(生成器)—对象创建型模式 一 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 二 适用性 在以下情况使用Build模式: 1 当创建复杂对象的算法应 ...

  5. 阿里云服务器被他人通过SSH暴力破解后的安全加固

    背景说明:我登录阿里云服务器控制台时,收到几条安全警告信息. 从图中可以知道,对方的IP地址是47.97.68.118,通过SSH登录方式,登录时用我服务器里的admin用户,然后用穷举法暴力破解ad ...

  6. iphone设置fiddler代理测试

    iPhone上配置fiddler为代理方法: 打开IPhone, 找到你的网络连接,打开HTTP代理,输入Fiddler所在机器的IP地址(比如:192.168.1.104) 以及Fiddler的端口 ...

  7. 详解php 获取文件名basename()函数的用法

    PHP 中basename()函数给出一个包含有指向一个文件的全路径的字符串,此函数返回基本的文件名,本篇文章收集了关于使用PHP basename()函数获取文件名的几篇文章,希望对大家理解使用PH ...

  8. RESTful API的十个最佳实践

    WebAPI在过去几年里非常的盛行,我们很多以往的技术手段都慢慢的转换为使用WebAPI来开发,因为它的语法简单规范化,以及轻量级等特点,这种方式收到了广泛的推崇. 通常我们使用RESTFul(Rep ...

  9. Android 开发中三种多线程

    在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各 ...

  10. 关于微信小程序开发中遇到的缺少game.json问题的解决

    一.小程序开发的两种选项 ①小游戏开发:内部对应的入口配置文件为game.json丶game.wxml之类的文件或者项目. ②小程序开发:内部对应的入口配置文件为app.json丶app.wxml之类 ...