SDOI征途--斜率优化
题目描述
给定长为 n 的数列 a, 要求划分成 m 段,使得方差最小, 输出方差\(*m^2\)
题解
斜率优化好题
准备部分
设第 i 段长为 \(len_i\)
先考虑方差(\(S^2\))的式子:
\]
拆项得 -->
\]
-->
\]
-->
\]
再把\(m^2\)乘进去
\]
可发现$$-\sum_{i=1}^{m}len_i^2$$ 这一坨是常数,也就是原序列和的平方
然后开始DP
设 f[i][k] 表示当前在第 i 个数,划分成 k 段
转移时枚举第 k 段的起点 j+1 (终点是 i ,注意这里枚举的是j+1):
\]
再用滚动数组g(也可不用)与前缀和sum记录一下 a[l] 优化就好
也就是
\]
斜率优化
把上面的DP转移方程拆开即得:
\]
把\(g[j]+sum[j]^2\) 看做 Y;
把\(sum[j]^2\) 看做 X;
把\(-2*sum[i]\) 看做 K;
把\((sum[i]^2-f[i])\) 看做 B;
然后用单调队列维护一下斜率递增的决策点就好
代码
#include<bits/stdc++.h>
using namespace std;
#define re register
#define in inline
#define get getchar()
#define ll long long
in int read()
{
int t=0; char ch=get;
while(ch<'0' || ch>'9') ch=get;
while(ch<='9' && ch>='0') t=t*10+ch-'0', ch=get;
return t;
}
const int _=5001;
int n,m;
ll sum[_],f[_],g[_],q[_];
#define db double
in db calc(int a,int b)
{
ll Y1=g[a]+sum[a]*sum[a],Y2=g[b]+sum[b]*sum[b];
return 1.0*(Y1-Y2)/(sum[a]-sum[b]);
}
int main()
{
n=read(),m=read();
for(re int i=1;i<=n;i++){
sum[i]=sum[i-1]+read();
g[i]=sum[i]*sum[i];
}
for(re int k=2;k<=m;k++)
{
int l=1,r=0;
q[l]=0;q[0]=0;
for(re int i=1;i<=n;i++)
{
while(l<r && calc(q[l],q[l+1]) < 2*sum[i]) l++;
int j=q[l];
f[i]=g[j]+(sum[i]-sum[j])*(sum[i]-sum[j]);
while(l<r && calc(q[r],i) < calc(q[r-1],i)) r--;
q[++r]=i;
}
memcpy(g,f,sizeof(g));
}
cout<<m*f[n]-sum[n]*sum[n]<<endl;
}
SDOI征途--斜率优化的更多相关文章
- 洛谷 P4072 [SDOI2016]征途 斜率优化DP
洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...
- bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...
- BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]
4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...
- bzoj4518[Sdoi2016]征途 斜率优化dp
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1657 Solved: 915[Submit][Status] ...
- [SDOI2016 Round1] 征途[斜率优化]
2225. [SDOI2016 Round1] 征途 ★★★☆ 输入文件:menci_journey.in 输出文件:menci_journey.out 简单对比时间限制:1 s 内存 ...
- 【BZOJ4518】[Sdoi2016]征途 斜率优化
[BZOJ4518][Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除 ...
- 【bzoj4518】[Sdoi2016]征途 斜率优化dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6812435.html 题目描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界 ...
- [bzoj4518][Sdoi2016]征途-斜率优化
Brief Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须 ...
- bzoj4518征途 斜率优化
征途这是一道十分经典的斜率优化 我们可以从题目中的方差来想,也就很容易的到这个式子 \[ans=m^2*\frac{\sum_{i=1}^{m}{(x_i-{\overline{x}})^2}}{m} ...
随机推荐
- springboot+mybatis集成分页功能
1.使用idea搭建srpingboot项目 在pom.xml文件中引入如下的依赖: <dependency> <groupId>org.springframework.boo ...
- Spring AOP系列(一)— 代理模式
Spring AOP系列(一)- 代理模式 AOP(Aspect Oriented Programming)并没有创造或使用新的技术,其底层就是基于代理模式实现.因此我们先来学习一下代理模式. 基本概 ...
- Python-一切皆对象
Python 动态.灵活根本是什么? Python中一切皆对象,面向对象更加彻底,函数.类也是对象,属于一等公民 一等公民特性 1. 可以赋值给一个变量 def name(name="北门吹 ...
- Python实现的数据结构与算法之基本搜索详解
一.顺序搜索 顺序搜索 是最简单直观的搜索方法:从列表开头到末尾,逐个比较待搜索项与列表中的项,直到找到目标项(搜索成功)或者 超出搜索范围 (搜索失败). 根据列表中的项是否按顺序排列,可以将列表分 ...
- error C2065: “uint8_t”: 未声明的标识符
转载:https://blog.csdn.net/lys07962000/article/details/12052571 参考: http://blog.csdn.net/chenxin_130/a ...
- 刷LeetCode的简易姿势
近期抽空刷了刷LeetCode,算是补补课. 由于不是很习惯直接在网页上Coding&Debug,所以还是在本地环境下进行编码调试,觉得基本OK后再在网页上提交. 主要采用Python3进行提 ...
- [学习笔记] Tarjan算法求强连通分量
今天,我们要探讨的就是--Tarjan算法. Tarjan算法的主要作用便是求一张无向图中的强连通分量,并且用它缩点,把原本一个杂乱无章的有向图转化为一张DAG(有向无环图),以便解决之后的问题. 首 ...
- Iptables 下 SNAT、DNAT和MASQUERADE三者之间的区别
Iptables 中可以灵活的做各种网络地址转换(NAT,Network Address Translation) 网络地址转换(NAT)主要有两种:SNAT 和 DNAT,但是也有一种特例 MASQ ...
- Python基础笔记1-Python读写yaml文件(使用PyYAML库)
最近在搭建自动化测试项目过程中经常遇到yaml文件的读写,为了方便后续使用,决定记下笔记. 一,YAML 简介 YAML,Yet Another Markup Language的简写,通常用来编写项目 ...
- if-else和if if的对比