[BZOJ4518]征途
4518: [Sdoi2016]征途
Time Limit: 10 Sec Memory Limit: 256 MB
Description
Input
Output
一个数,最小方差乘以 m^2 后的值
Sample Input
1 2 5 8 6
Sample Output
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]征途的更多相关文章
- bzoj4518征途 斜率优化
征途这是一道十分经典的斜率优化 我们可以从题目中的方差来想,也就很容易的到这个式子 \[ans=m^2*\frac{\sum_{i=1}^{m}{(x_i-{\overline{x}})^2}}{m} ...
- P4072 [SDOI2016](BZOJ4518) 征途 [斜率优化DP]
题目描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...
- [SDOI2015][bzoj4518] 征途 [斜率优化dp]
题面 传送门 思路 把$vm^2$展开化一下式子,可以得到这样的等价公式: $vm^2=m\sum_{i=1}^m a_i^2-\sum_{i=1}^m a_i$ 那么我们要最小化的就是$\sum_{ ...
- [SDOI2016]部分题选做
听说SDOI蛮简单的,但是SD蛮强的.. 之所以是选做,是因为自己某些知识水平还不到位,而且目前联赛在即,不好花时间去学sa啊之类的.. bzoj4513储能表&bzoj4514数字配对 已写 ...
- SDOI2016 Round1 题解
BZOJ4513 储能表 数位DP,f[i][2][2][2]表示前i位,是否卡n的上界,是否卡m的上界,是否卡k的下界,枚举每一维的下一位直接转移. #include<cstdio> # ...
- 【BZOJ4518】[Sdoi2016]征途 斜率优化
[BZOJ4518][Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除 ...
- BZOJ4518 Sdoi2016 征途 【斜率优化DP】 *
BZOJ4518 Sdoi2016 征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m ...
- 【bzoj4518】 Sdoi2016—征途
http://www.lydsy.com/JudgeOnline/problem.php?id=4518 (题目链接) 题意 给出n个连续的整数,求将它们分成m段,求最小方差*m^2. Solutio ...
- bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...
随机推荐
- 利用Apache POI 实现简单的Excel表格导出
1.利用POI API实现简单的Excel表格导出 首先假设一个学生实体类: package com.sun.poi.domain; import java.io.Serializable; impo ...
- linux的大小端、网络字节序问题 .
1.80X86使用小端法,网络字节序使用大端法. 2.二进制的网络编程中,传送数据,最好以unsigned char, unsigned short, unsigned int来处理, unsigne ...
- office web apps 整合Java web项目
之前两篇文章将服务器安装好了,项目主要的就是这么讲其整合到我们的项目中,网上大部分都是asp.net的,很少有介绍Java如何整合的,经过百度,终于将其整合到了我的项目中. 首先建个servlet拦截 ...
- luogu P1007 独木桥
序:难度标签是普及-,便觉得应该非常简单,结果发现有一个弯半天没绕过来,所以认为这道题对于第一次做的人来讲还是很是比较有意义的. 题目描述: 长度为len的桥上有n个士兵,你不知道他们的初始方向.已知 ...
- Power Pivot表属性无法切换回表预览模式的问题
近期Office365用户升级后解决了在Power Pivot中输入中文的问题,但是同时也带来了一个新的问题就是表属性窗口默认为“查询编辑器”模式,且无法切换回“表预览”模式. 本文和您分享在这种情况 ...
- hdu4639 hehe 递推
此题为递推题 现场比赛中由于心态问题没能快速推出来定义f[i]为i个连续的he可以表示的语意的个数 则如果第i个he单独考虑f[i]=f[i-1];如果将第i个he和第i-1个he组合 则其只能表示为 ...
- Linux-vim学习入门
1.前言 vi/vim是linux中很重要的文本编辑器.我第一次使用这个编辑器时,很不习惯,甚至都不知道如何移动光标和插入字符.慢慢地经过学习,才知道如何使用vi/vim. vi/vi ...
- LinkedHashMap:我还能实现LRU
众所周知,LinkedHashMap继承自HashMap,在原先的HashMap的基础上,它增加了Entry的双向链接. 有意思的是基于这种实现特性,LinkedHashMap 在迭代遍历时,取得键值 ...
- Java高效计数器
本文转载地址: http://blog.csdn.net/renfufei/article/details/14120775 我们经常使用 HashMap作为计数器(coun ...
- php的八大数据类型
1. 八大数据: bool 布尔类型:0,1:真假 integer 整形 float 浮点型 string 字符串 array 数组 object 对象,类,class resource 文件,图片, ...