斜率优化裸题

题意大概是:求 最小的 \(m^2s^2\) =\(m^2(\frac{1}{m}\sum_{i=1}^{m}(sum_i - {\frac{\sum_{i=1}^{m}sum_i}{m})^2})\)

= \(m^2 (\frac{1}{m} \sum_{i=1}^{m}sum_i^2 - \frac{1}{m^2}(\sum_{i=1}^{m}sum_i)^2)\)

= \(m\sum_{i=1}^{m}sum_i ^2 - (\sum_{i=1}^{m}sum_i)^2\)

然后我们发现\((\sum_{i=1}^{m}sum_i)^2\)是一个定值

所以我们只需要最小化\(m\sum_{i=1}^{m}sum_i ^2\)

发现 \(m\) 这个常数也可以最后再乘上

所以 考虑 最小化 \(\sum_{i=1}^{m}sum_i ^2\)

转移方程是 \(f_{i,j}\) = \(min\){\(f_{i-1,k}+(sum_j-sum_k)^2\)}

这样就可以 \(n^2m\)求解了

考虑斜率优化

比较 \(x\) 和 \(y\)

设 \(x\) 的转移优于 \(y\)

即 \(f_{i-1,x} +(sum_j-sum_x)^2<f_{i-1,y}+(sum_j-sum_y)^2\)

\(f_{i-1,x}+(sum_j^2+sum_x^2-2sum_{j}*sum_{x})<f_{i-1,y}+(sum_j^2+sum_y^2-2sum_j*sum_y)\)

\(\large \frac{f_{i-1,x}-f_{i-1,y}+sum_x^2-sum_y^2}{sum_x-sum_y}<2*sum_{j}\)

很显然这样就可以斜率优化了

// Isaunoya
#include<bits/stdc++.h>
using namespace std ;
#define int long long
#define fi first
#define se second
#define pb push_back
inline int read() {
register int x = 0 , f = 1 ;
register char c = getchar() ;
for( ; ! isdigit(c) ; c = getchar()) if(c == '-') f = -1 ;
for( ; isdigit(c) ; c = getchar()) x = (x << 1) + (x << 3) + (c & 15) ;
return x * f ;
}
template < typename T > inline bool cmax(T & x , T y) {
return x < y ? (x = y) , 1 : 0 ;
}
template < typename T > inline bool cmin(T & x , T y) {
return x > y ? (x = y) , 1 : 0 ;
}
inline int QP(int x , int y , int Mod){ int ans = 1 ;
for( ; y ; y >>= 1 , x = (x * x) % Mod)
if(y & 1) ans = (ans * x) % Mod ;
return ans ;
}
int n , m ;
const int N = 3000 + 5 ;
int a[N] , sum[N] ;
int f[2][N] , q[N] ;
inline int sqr(int x) { return x * x ; }
inline double slope(int i , int j , int k) {
return 1.00 * (f[i & 1][j] - f[i & 1][k] + sqr(sum[j]) - sqr(sum[k])) / (double)(sum[j] - sum[k]) ;
}
signed main() {
n = read() ; m = read() ;
for(register int i = 1 ; i <= n ; i ++) a[i] = read() ;
for(register int i = 1 ; i <= n ; i ++) sum[i] = sum[i - 1] + a[i] ;
memset(f , 0x3f , sizeof(f)) ;
f[0][0] = 0 ;
for(register int i = 1 ; i <= n ; i ++) f[1][i] = sum[i] * sum[i] ;
for(register int i = 2 ; i <= m ; i ++) {
int h = 1 , t = 0 ;
for(register int j = 1 ; j <= n ; j ++) {
while(h < t && slope(i - 1 , q[h] , q[h + 1]) < 2 * sum[j]) h ++ ;
int k = q[h] ; f[i & 1][j] = f[(i & 1) ^ 1][k] + sqr(sum[j] - sum[k]) ;
while(h < t && slope(i - 1 , q[t] , q[t - 1]) > slope(i - 1 , q[t] , j)) t -- ;
q[++ t] = j ;
}
} printf("%lld\n" , m * f[m & 1][n] - sqr(sum[n])) ;
return 0 ;
}

P4072 [SDOI2016]征途的更多相关文章

  1. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

  2. [洛谷P4072] SDOI2016 征途

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

  3. 洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)

    洛谷题目传送门 一开始肯定要把题目要求的式子给写出来 我们知道方差的公式\(s^2=\frac{\sum\limits_{i=1}^{m}(x_i-\overline x)^2}{m}\) 题目要乘\ ...

  4. 洛谷P4072 [SDOI2016]征途(斜率优化)

    传送门 推式子(快哭了……)$$s^2*m^2=\sum _{i=1}^m (x_i-\bar{x})^2$$ $$s^2*m^2=m*\sum _{i=1}^m x_i^2-2*sum_n\sum ...

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

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

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

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

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

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

  8. bzoj4518[Sdoi2016]征途 斜率优化dp

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

  9. BZOJ_4518_[Sdoi2016]征途_斜率优化

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

随机推荐

  1. kendo ui - core

    通过CDN 引入kendo-ui-core git地址:http://www.telerik.com/kendo-ui<link href="http://kendo.cdn.tele ...

  2. [MacOS]Chrome 强制刷新

    Chrome 调试的时候经常发现缓存没有清理 MacOS :⌘+⇧+r Windows:Ctrl + F5

  3. MD5加密常用js库:crypto-js

    学习链接:https://github.com/brix/crypto-js

  4. Swift 枚举-从汇编角度看枚举内存结构

    一.基本使用 先看枚举的几种使用(暂不要问,看看是否都能看懂,待会会逐一讲解) 1.操作一 简单使用 //第一种方式 enum Direction { case east case west case ...

  5. (数据科学学习手札78)基于geopandas的空间数据分析——基础可视化

    本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 通过前面的文章,我们已经对geopanda ...

  6. 开源工作流管理系统节点接收人设置“指定节点处理人”系列讲解

    关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单  拖拽式表单 工作流系统CCBPM节点访问规则接收人规则 适配数据库: o ...

  7. Linux btrfs文件系统

    btrfs,它名字挺多:B-tree fs;Butter fs;Better fs 开源协议是GPL,2007年由Oracle研发 核心特性: 多物理卷支持,btrfs可由多个物理卷组成:支持RAID ...

  8. visual studio 2019:error c2760

    笔者在敲书上的练习题时(完全按照书上代码,没有语法错误),报"error c2760"错误. 代码出错位置(代码并没有问题): 在网上查找了一下,发现"c2760&quo ...

  9. 折腾vue--vue自定义组件(三)

    1.创建组件  demo.vue,内容如下: <template> <div> <input type="button" :value="n ...

  10. OHEM论文笔记

    目录 引言 Fast R-CNN设计思路 一.动机 二.现有方案hard negative mining 及其窘境 hard negative mining实现 窘境 设计思路 OHEM步骤: 反向传 ...