4518: [Sdoi2016]征途

Time Limit: 10 Sec  Memory Limit: 256 MB

Description

Pine开始了从S地到T地的征途。
从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。
Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。
Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。
帮助Pine求出最小方差是多少。
设方差是v,可以证明,v×m^2是一个整数。为了避免精度误差,输出结果时输出v×m^2。

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

题解:

推式子的感觉真刺激呀....

我们复习一下方差的定义:数值与平均值之差的平方和的平均值

设s[i]为前缀和,设X0是平均值,则X0=s[n]/m

也就是说,V=((X1-X0)2+(X2-X0)2+......+(Xm-X0)2)/m

由于答案是V*m2,所以我们不妨把m2直接带上.

所以有:

ans=((X1-X0)2+(X2-X0)2+......+(Xm-X0)2)*m

   =m*ΣXi2+m*X02*m-2*X0*m*ΣXi

   =m*ΣXi2+s[n]2-2*s[n]2

=m*ΣXi2-s[n]2

这样我们就找到了一个很简洁的表达式

但是如果直接计算这个式子,你会发现推不出来,所以我们转化一下角度,转而计算ΣXi2的值.

我们可以维护一个数组f[i][j],表示在第j段路结尾,第i次休息的时候最小的ΣXi2,那么答案就是m*f[m][n]-s[n]2

那么f[i][j]=min{f[k][j-1]+(s[i]-s[k])2}.

分析一下复杂度,Ο(m*n*n),如果是极限数据会变成30003,这样就要t了

所以我们考虑优化,对于可能转移到i的2个位置k1与k2,k1优于k2的条件是什么?(公式恐惧症的同学不要跑啊......)

f[k1][j-1]+(s[i]-s[k1])2<f[k2][j-1]+(s[i]-s[k2])2

f[k1][j-1]-f[k2][j-1]<(s[i]-s[k2])2-(s[i]-s[k1])2

f[k1][j-1]-f[k2][j-1]<s[i]2-2*s[i]*s[k2]+s[k2]2-(s[i]2-2*s[i]*s[k1]+s[k1]2)

f[k1][j-1]-f[k2][j-1]<s[k2]2-s[k1]2-2*s[i]*s[k2]+2*s[i]*s[k1]

f[k1][j-1]-f[k2][j-1]+s[k1]2-s[k2]2<2*s[i]*(s[k1]-s[k2])

(f[k1][j-1]-f[k2][j-1]+s[k1]2-s[k2]2)/(s[k1]-s[k2])<2*s[i]

所以我们用一个单调队列维护就行啦,剩下的维护判断就比较简单了~

代码见下:

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=;
LL len[N],n,m,s[N],f[N][N];
int q[N];
inline int min(int a,int b){return a<b?a:b;}
inline double k(int j,int k1,int k2)
{
double a=(double)(f[j-][k1]-f[j-][k2]+s[k1]*s[k1]-s[k2]*s[k2]);
return a/(double)(s[k1]-s[k2]);
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++)
scanf("%lld",&len[i]),s[i]=s[i-]+len[i];
for(int j=;j<=n;j++)
f[][j]=s[j]*s[j];
for(int i=,h=,t=;i<=m;i++,h=,t=)
{
memset(q,,sizeof(q));
for(int j=;j<=n;j++)
{
while(h<t&&k(i,q[h+],q[h])<*s[j])h++;
f[i][j]=f[i-][q[h]]+(s[j]-s[q[h]])*(s[j]-s[q[h]]);
while(h<t&&k(i,j,q[t])<k(i,q[t],q[t-]))t--;
q[++t]=j;
}
}
printf("%lld",m*f[m][n]-s[n]*s[n]);
}

BZOJ4815

[BZOJ4518]征途的更多相关文章

  1. bzoj4518征途 斜率优化

    征途这是一道十分经典的斜率优化 我们可以从题目中的方差来想,也就很容易的到这个式子 \[ans=m^2*\frac{\sum_{i=1}^{m}{(x_i-{\overline{x}})^2}}{m} ...

  2. P4072 [SDOI2016](BZOJ4518) 征途 [斜率优化DP]

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

  3. [SDOI2015][bzoj4518] 征途 [斜率优化dp]

    题面 传送门 思路 把$vm^2$展开化一下式子,可以得到这样的等价公式: $vm^2=m\sum_{i=1}^m a_i^2-\sum_{i=1}^m a_i$ 那么我们要最小化的就是$\sum_{ ...

  4. [SDOI2016]部分题选做

    听说SDOI蛮简单的,但是SD蛮强的.. 之所以是选做,是因为自己某些知识水平还不到位,而且目前联赛在即,不好花时间去学sa啊之类的.. bzoj4513储能表&bzoj4514数字配对 已写 ...

  5. SDOI2016 Round1 题解

    BZOJ4513 储能表 数位DP,f[i][2][2][2]表示前i位,是否卡n的上界,是否卡m的上界,是否卡k的下界,枚举每一维的下一位直接转移. #include<cstdio> # ...

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

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

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

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

  8. 【bzoj4518】 Sdoi2016—征途

    http://www.lydsy.com/JudgeOnline/problem.php?id=4518 (题目链接) 题意 给出n个连续的整数,求将它们分成m段,求最小方差*m^2. Solutio ...

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

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

随机推荐

  1. js 时间时间戳互换

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  2. 初识Kafka----------Centos上单机部署、服务启动、JAVA客户端调用

    作为Apach下一个优秀的开源消息队列框架,Kafka已经成为很多互联网厂商日志采集处理的第一选择.后面在实际应用场景中可能会应用到,因此就先了解了一下.经过两个晚上的努力,总算是能够基本使用. 操作 ...

  3. android奋战的一周

    移动开发项目终于开始了,我也开始紧张起来了,就靠着培训时候学的一知半解的知识,作为一个主力不得不逼着自己不停的做实验,不停的学习. 有辛苦就有回报,我也对android开发中整体的框架有了些许的了解. ...

  4. Windows7系统的封装

    系统装到虚拟机优化完成以后,可以装上自己想要装的软件,也可以不装做个纯净版的.今天用ES封装,首先打开一般我们只点这四项就够了,如下图 写上自己想写的,也可以不写系统默认,直接点“下一步”关闭设备管理 ...

  5. extern用法详解

    1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 另外,extern也可用来进行链接指定. 2 问题:ext ...

  6. hdu1151有向图的最小顶点覆盖

    有向图的最小路径覆盖=V-二分图最大匹配. Consider a town where all the streets are one-way and each street leads from o ...

  7. js,jQuery和DOM操作的总结(二)

    jQuery的基本操作 (1)遍历键值对和数组 , , , , , ]; $.map(arr, function (ele, index) { alert(ele + '===' + index); ...

  8. Linux下链接数据库图形化工具

    (一).Linux环境下mysql的安装.SQL操作 Linux下安装MySQL (rmp --help) 基本步骤:上传软件->检查当前Linux环境是否已经安装,如发现系统自带的,先卸载-& ...

  9. Kafka学习-Producer和Customer

    在上一篇kafka入门的基础之上,本篇主要介绍Kafka的生产者和消费者. Kafka 生产者 kafka Producer发布消息记录到Kakfa集群.生产者是线程安全的,可以在多个线程之间共享生产 ...

  10. mac Ubuntu 设置快捷进入目录

    在我们实际工作中,好多时间需要经常性的进入某个目录查看文件等等之类的操作. 好多时候我们都是在终端一级一级的进入目录,相比较Windows的快捷方式有点繁琐. 废话少说,下面就是设置快捷方式的方法: ...