征途 bzoj 4518
征途
【问题描述】
Pine开始了从S地到T地的征途。
从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。
Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。
Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。
帮助Pine求出最小方差是多少。
设方差是v,可以证明,v×m^2是一个整数。为了避免精度误差,输出结果时输出v×m^2。
【输入格式】
第一行两个数 n、m。
第二行 n 个数,表示 n 段路的长度
【输出格式】
一个数,最小方差乘以 m^2 后的
【样例输入】
1 2 5 8 6
【样例输出】
【数据范围】
1≤n≤3000,保证从 S 到 T 的总路程不超过 30000
题解:
来推一下式子:
方差:(x1 - aver)2 + (x2 - aver)2 + ... + (xm - aver)2 / m
然后题意要求乘m2
那么
m×[(x1 - aver)2 + (x2 - aver)2 + ... + (xm - aver)2 ]
= m×[x12 + x22 + ... + xm2 - 2aver(x1 + x2 + ... + xm ) + m × aver2]
= m×(x12 + x22 + ... + xm2) - 2sum2 + sum2 (aver = sum / m)
= m×(x12 + x22 + ... + xm2) - sum2
其实m和sum都为常量,那么只要考虑中间的平方和部分
设f[i][j]为分到点j且分成i段时每一段的平方和
转移方程即为:f[i][j] = min(f[i][j], f[i - 1][k] + (sum[j] - sum[k]) * (sum[j] - sum[k])); (k < j)
三方效率肯定过不了,看出这是一个斜率优化的裸题,那就可以虾搞蛋了~\(≧▽≦)/~
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
inline int Get()
{
int x = ;
char c = getchar();
while('' > c || c > '') c = getchar();
while('' <= c && c <= '')
{
x = (x << ) + (x << ) + c - '';
c = getchar();
}
return x;
}
int n, m;
int t, w;
int c[];
int s[];
long long aver;
long long f[][];
long long sum[];
double Up(int x, int y, int i)
{
return f[i - ][x] + sum[x] * sum[x] - f[i - ][y] - sum[y] * sum[y];
}
double Down(int x, int y)
{
return (sum[x] - sum[y]) << ;
}
long long Dp(int i, int j, int x)
{
return f[i - ][x] + (sum[j] - sum[x]) * (sum[j] - sum[x]);
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= m; ++i)
for(int j = ; j <= n; ++j)
f[i][j] = 214748364721474836LL;
for(int i = ; i <= n; ++i)
{
scanf("%d", &c[i]);
sum[i] = sum[i - ] + c[i];
f[][i] = sum[i] * sum[i];
}
aver = sum[n];
for(int i = ; i <= m; ++i)
{
t = , w = ;
s[++w] = i - ;
for(int j = i; j <= n; ++j)
{
/*
for(int k = i - 1; k <= j; ++k)
f[i][j] = min(f[i][j], f[i - 1][k] + (sum[j] - sum[k]) * (sum[j] - sum[k]));
*/
while(t < w && Up(s[t], s[t + ], i) / Down(s[t], s[t + ]) <= sum[j]) ++t;
f[i][j] = Dp(i, j, s[t]);
while(t < w && Up(j, s[w], i) / Down(j, s[w]) <= Up(s[w], s[w - ], i) / Down(s[w], s[w - ])) --w;
s[++w] = j;
}
}
printf("%lld", (long long) m * f[m][n] - aver * aver);
}
征途 bzoj 4518的更多相关文章
- 动态规划(决策单调优化):BZOJ 4518 [Sdoi2016]征途
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 532 Solved: 337[Submit][Status][ ...
- BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]
4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...
- BZOJ 4518 [Sdoi2016]征途(分治DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4518 [题目大意] 给出一个数列,分成m段,求方差最小,答案乘上m的平方. [题解] ...
- ●BZOJ 4518 [Sdoi2016]征途
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4518 题解: 斜率优化DP 首先看看最后答案的形式: 设a[i]为第i天走的距离,那么 $A ...
- bzoj 4518: [Sdoi2016]征途
Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...
- 【题解】征途 SDOI 2016 BZOJ 4518
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4518 首先推式子,我们用$x_i$表示第$i$段的路程,$sum$表示总路程,根据方差和平均 ...
- 征途(bzoj 4518)
Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...
- BZOJ 4518 征途
斜率优化.又是变量名打错看了老半天. 把方差式子展开一下就好了. #include<iostream> #include<cstdio> #include<cstring ...
- 【BZOJ 4518】【SDOI 2016 Round1 Day2 T3】征途
比较明显的斜率优化DP,省选时因为时间太紧张和斜率DP写得不熟等原因只写了60分的暴力DP,其实当时完全可以对拍来检验标算的正确,但是我当时too naive- 很快打完了,调了将近一晚上QAQ,因为 ...
随机推荐
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- Linux 利用Google Authenticator实现ssh登录双因素认证
1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...
- uboot环境配置
uboot环境配置 通过配置uboot让它在启动过程中从tftp获取内核和设备树,并从在加载内核之后把通过启动参数将"从nfs挂载根文件系统"传入内核.这个配置主要是通过uboot ...
- CentOS7下自定义目录安装mono+jexus教程
一.阅读前须知: 1.本文属于安装完Centos7之后的步骤 2.如果还不了解mono,请点击mono 3.本篇主要内容是使用自定义目录安装mono+jexus教程,使用默认目录请查看使用默认目录安装 ...
- mysql集群(主从)
本文主要记录mysql 主从配置. 经典的原理图 0.环境: 采用阿里云ECS服务器,同区同配置,操作系统为ubuntus 14 64位,服务器如下: 服务器A: 内网IP: 10.44.94.219 ...
- Spring5:@Autowired注解、@Resource注解和@Service注解
什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...
- [异常解决] How to build a gcc toolchain for nRF51 on linux (very detailed!!!)
1.Install gcc-arm-none-eabi https://devzone.nordicsemi.com/tutorials/7/This link shows that developm ...
- CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率
CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率 当场景中有比较复杂的模型时,条件渲染能够加速对复杂模型的渲染. 条件渲染(Conditio ...
- 关于百度编辑器UEditor的一点说明
大家在使用的时候要特别注意editor_config.js中的“URL”这个参数 我的理解:1.这个参数是editor整个结构的总路径 2.首先要把这个路径配置好了.才能正常的显示, ...
- Cookie和Session的总结
1.开篇 在之前学习这一段的时候我一直有点没弄清楚,其实对Session这块的理解还可以,但是Cookie感觉始终还是欠缺点火候.之后的很长一段时间都基本上很少用Cookie了,渐渐的也淡忘了这一块的 ...