「SDOI2016」征途

先浅浅复制一个方差

显然dp,可以搞一个

\(dp[i][j]\)为前i段路程j天到达的最小方差

开始暴力转移

\(dp[i][j]=min(dp[k][j-1]+?)(j-1\leq k\leq i-1)\)这咋写?还是需要转换一下

开始了,but题目的方差还需要m^2,很好

以下x为m天行走的平均值,s[i]为1~i段路的总路程

那么x可以算对吧:\(x=\frac{s[n]}{m}\)

\[m\times \sum^m_{i=1}(x_i-x)^2\\
=m\times \sum^m_{i=1}(x_i^2+x^2-2xx_i)\\
=m\times (\sum^m_{i=1}x_i^2+\sum^m_{i=1}x^2-\sum^m_{i=1}2xx_i)\\
=m\times (\sum^m_{i=1}x_i^2+\frac{s[n]^2}{m}-\frac{2s[n]}{m}\sum^m_{i=1}x_i)\\
=m\times (\sum^m_{i=1}x_i^2+\frac{s[n]^2}{m}-\frac{2s[n]^2}{m})\\
=m\times (\sum^m_{i=1}x_i^2-\frac{s[n]^2}{m})\\
=m\times \sum^m_{i=1}x_i^2-s[n]^2
\]

是不是感觉快完了推真爽

所以我们似乎只需要维护\(\sum^m_{i=1}x_i^2\)最小就好了!

重新定义\(dp[i][j]\)为前i段路程分j天到达的每天路程平方的和的最小值

最后答案就应该是\(dp[n][m]\times m-s[n^2]\)

好,开始看状态转移

\(dp[i][j]=min(dp[k][j-1]+(s[i]-s[k])^2)(j-1\leq k\leq i-1)\)很简单的状态转移,但是复杂度\(n^3\)不接受,好像只有\(n^2\)可以的样子(带\(log\)的方法就别杠)

那怎么优化?

我们发现好像是跟\(s[i]*s[k]\)有关,不能直接单调队列,那斜率优化吧!

\[dp[i][j]=dp[k][j-1]+(s[i]-s[k])^2\\
dp[i][j]=dp[k][j-1]+s[i]^2+s[k]^2-2s[i]s[k]\\
dp[k][j-1]+s[k]^2=2s[i]s[k]-s[i]^2-dp[i][j]\\
\]

点为\((s[k],dp[k][j-1]+s[k]^2)\),斜率就是\(2s[i]\)

然后就是愉快的判断是撒子凸壳的时候了,刚学的

假设k1>k2,并且k1优于k2

\[dp[k1][j-1]+s[i]^2+s[k1]^2-2s[i]s[k1]<dp[k2][j-1]+s[i]^2+s[k2]^2-2s[i]s[k2]\\
dp[k1][j-1]+s[k1]^2-dp[k2][j-1]-s[k2]^2<2s[i](s[k1]-s[k2])\\
\frac {(dp[k1][j-1]+s[k1]^2)-(dp[k2][j-1]+s[k2]^2)}{(s[k1]-s[k2])}<2s[i]
\]

因为是小于,所以是下凸壳,然后就完了噢!

呼,公式真难打

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=3010;
int a[maxn];
ll f[maxn][maxn],s[maxn];
ll db(ll x){
return x*x;
}
int n,m;
ll y(int j,int k){
return f[k][j-1]+db(s[k]);
}
int q[maxn],head,tail=1;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
s[i]=s[i-1]+a[i];
f[i][1]=s[i]*s[i];
}
//以后最后都把第一种情况初始化了!!!!不然调用空的就容易错
for(int j=2;j<=m;j++){//注意j为1也就是只分成一段的情况的初始化!!是s[i]*s[i]!!!!!!
tail=head=0;
q[tail++]=j-1;
for(int i=j;i<=n;i++){
while(head+1<tail&&y(j,q[head+1])-y(j,q[head])
<=2*s[i]*(s[q[head+1]]-s[q[head]]))head++;
if(head<tail){
int k=q[head];
f[i][j]=f[k][j-1]+db(s[i]-s[k]);
}
while(head+1<tail&&(y(j,q[tail-1])-y(j,q[tail-2]))*(s[i]-s[q[tail-1]])
>=(y(j,i)-y(j,q[tail-1]))*(s[q[tail-1]]-s[q[tail-2]]))tail--;
q[tail++]=i;
}
}
printf("%lld",f[n][m]*m-db(s[n]));
return 0;
}

「SDOI2016」征途 题解的更多相关文章

  1. 「SDOI2016」征途

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

  2. 【LOJ】#2035. 「SDOI2016」征途

    题解 有人管它叫带权二分,有人管它叫dp凸优化,有人管它叫wqs二分-- 延伸出来还有zgl分治,xjp¥!%#!@#¥!# 当我没说 我们拆个式子,很容易发现所求的就是 \(m\sum_{i = 1 ...

  3. loj2035 「SDOI2016」征途

    学了斜率优化这题就能一气呵成地做出来啦qwqqwq #include <iostream> #include <cstdio> using namespace std; typ ...

  4. [LOJ 2070] 「SDOI2016」平凡的骰子

    [LOJ 2070] 「SDOI2016」平凡的骰子 [题目链接] 链接 [题解] 原题求的是球面面积 可以理解为首先求多面体重心,然后算球面多边形的面积 求重心需要将多面体进行四面体剖分,从而计算出 ...

  5. liberOJ #2033. 「SDOI2016」生成魔咒 后缀数组

    #2033. 「SDOI2016」生成魔咒     题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 11.2 22 拼凑起来形成一个魔咒串 [1,2] [1, 2] ...

  6. 「SDOI2016」数字配对

    「SDOI2016」数字配对 题目大意 传送门 题解 \(a_i\) 是 \(a_j\) 的倍数,且 \(\frac{a_i}{a_j}\) 是一个质数,则将 \(a_i,a_j\) 质因数分解后,其 ...

  7. 「SDOI2016」储能表(数位dp)

    「SDOI2016」储能表(数位dp) 神仙数位 \(dp\) 系列 可能我做题做得少 \(QAQ\) \(f[i][0/1][0/1][0/1]\) 表示第 \(i\) 位 \(n\) 是否到达上界 ...

  8. 「APIO2010」巡逻 题解

    来源 LCA 个人评价:lca求路径,让我发现了自己不会算树的直径(但是本人似乎没有用lca求) 1 题面 「APIO2010」巡逻 大意:有一个有n个节点的树,每条边权为1,一每天要从1号点开始,遍 ...

  9. 题解 loj2065 「SDOI2016」模式字符串

    点分治. 考虑经过当前分治中心\(u\)的点对数量. 这种数点对数的问题,有一个套路.我们可以依次考虑\(u\)的每个儿子,看用当前的儿子,能和之前已经考虑过的所有儿子,组成多少点对.这样所有合法的点 ...

随机推荐

  1. c++:-7

    上一节主要学习C++中的函数模版.数据结构以及排序查找操作:c++:-6,本节学习C++的范型程序设计和STL: 范型程序设计 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通 ...

  2. CAD图与互联网地图网页端相互叠加显示技术分析和实现

    需求分析 之前相关的博文中介绍了如果在Web网页端展示CAD图形(唯杰地图云端图纸管理平台 https://vjmap.com/app/cloud),当一些CAD图纸有实际地理坐标位置时,如地形图等, ...

  3. vagrant,VirtualBox -- 安装使用

    1.安装Oracle VM VirtualBox下载 http://download.virtualbox.org/virtualbox/5.2.44/ 2.安装vagrant https://www ...

  4. 安装Zookeeper到Linux

    系统版本:Ubuntu 16.04.5 LTS 软件版本:apache-zookeeper-3.5.8 硬件要求:无 1.安装依赖 Zookeeper需要JDK的支持. 注:需要先去JDK官网下载安装 ...

  5. Vue基础篇 之 v-model 模拟

    我们知道vue中 为简化表单输入 提供了v-model 的语法绑定 将 vue的属性和表单元素进行了双向绑定 大大简化了表单数据操作的数据绑定 那么v-model 是如何实现双向绑定的呢? 今天我们来 ...

  6. MVC 调试页面路径变成 Views/Controller/Action.cshtml问题

    MVC在路由里面已经写好了路径,但是调试时地址栏还是会变成 Views/Controller/Action.cshtml,导致报404错误,找不到路径. 原因可能是你将某一页面设为了起始页,导致每次运 ...

  7. vue大型电商项目尚品汇(前台篇)day05

    紧急更新第二弹,然后就剩下最后一弹,也就是整个前台的项目 一.购物车 1.加入购物车(新知识点) 加入到购物车是需要接口操作的,因为我们需要将用户的加入到购物车的保存到服务器数据库,你的账号后面才会在 ...

  8. 关于『HTML5』第一弹

    关于『HTML5』:第一弹 建议缩放90%食用 祝各位国庆节快乐!!1 经过了「过时的 HTML」.「正当时的 Markdown」的双重洗礼后,我下定决心,好好学习HTML5  这回不过时了吧(其实和 ...

  9. 人脸识别库 face_recognition

    face_recognition Windows系统环境下安装 默认环境:anaconda的python3.7版本,win10环境 第一步:安装dlib 从网络上下载: http://dlib.net ...

  10. 选择ERP频频踩雷?国内外ERP有差异,突破ERP软件单一性是关键

    信息化日新月异的蓬勃发展,导致企业在选择ERP软件时频频踩雷.企业如何选择出一个适合自己的ERP软件系统呢?是选择国外知名公司的ERP软件产品,还是选择国内性价比高的ERP软件产品呢,小编就带大家了解 ...