=传=送=门=

搜题目名会搜出很多奇怪的东西... 这个题目似乎有点毒?

比如在bzoj和loj上可以1A的代码上会在luogu TLE 2个点, 在cogs TLE 10个点 但是根据已有的资料来看数据都是一样的...毒瘤评测姬毁我OI!!!

这个题的状态转移方程并不是很好推的说. 出题人让\(*m^2\)肯定是有目的的啊..

(比如不让乘\(m^2\)我们可能会需要考虑乘\(m^2\)最后再除掉之类的)

然后就化一波式子: 我们令\(sum\)表示\(n\)段路的总和.

\[m^2s^2=m^2\frac{\sum_{i=1}^m(x_i-\bar x)^2}m=m\sum_{i=1}^m(x_i-\bar x)^2\\=m\sum_{i=1}^mx_i^2-m\sum_{i=1}^m2x_i\bar x+m\sum_{i=1}^m\bar x^2\\
=m\sum_{i=1}^mx_i^2-(2\sum_{i=1}^mx_i)*(m*\bar x)+m^2(\frac{sum}m)^2\\=m\sum_{i=1}^mx_i^2-2sum^2+sum^2=m\sum_{i=1}^mx_i^2-sum^2
\]

而\(m\)和\(sum^2\)都是常数我们可以不管, 那就是要求最小化\(\sum_{i=1}^mx_i^2\).

所以令\(f[i][j]\)表示前\(i\)天走了前\(j\)段路, \(s_i\)表示前\(i\)段路的前缀和, 那就能写出状态转移方程:

\[f[i][j]=min\{f[i-1][k]+(s_j-s_k)^2\} (k\in[1,j))
\]

那很明显这个是\(O(n^3)\)可以做的, 这样能拿到60pts了就.

但是想A的话 很明显要采用一种\(o(n^2)\)的算法. 当然你要能\(O(n)\)甚至\(O(1)\)过也没啥问题...

那我们就要搬出斜率优化了. 我们继续化式子.

首先很明显第一维跟后面这一堆没啥关系, 那就不优化了, 也可以把这一维去掉, 到时候一滚动数组(其实不滚也能过)就行了.

那状态转移方程就可以改写成:

\[f[j]=min\{f'[k]+(s_j-s_k)^2\}
\]

然后继续化成y=kx+b的形式, $$f[j]=f'[k]+s_j2-2s_js_k+s_k2$$

移项得\(f'[k]+s_k^2\)=\(2s_j\)\(s_k+\)\(f[j]-s_j^2\)

这样的话我们就可以正常的斜率优化了. 最后输出\(m*f[n][m]-sum^2\)就好啦~

不过要修一下边界条件.

  • 比如第\(i\)天完全可以从\(i\)开始找, 总不可能回去找前面的路(这样也不会出现被0除错误),
  • 然后\(f[1][x]\)显然应该等于\(s[x]^2\), 这样就可以了.
  • 然后又是要开long long的题整天开long long还是挺烦的, 什么时候普及64位系统啊= =

然后就是代码: 并不知道究竟能不能AC 请谨慎复制!

#include <cstdio>
#include <cstring>
const int N=3030;typedef long long LL;
LL s[N],q[N],n,m,h,t;LL f[N],g[N];
inline LL gn(LL a=0,char c=0){
for(;c<'0'||c>'9';c=getchar());
for(;c>47&&c<58;c=getchar())a=a*10+c-48;return a;
}
inline double slope(LL x,LL y){return 1.0*(g[x]+s[x]*s[x]-g[y]-s[y]*s[y])/(s[x]-s[y]);}
int main(){ n=gn(); m=gn();
for(LL i=1;i<=n;++i) s[i]=s[i-1]+gn(),g[i]=s[i]*s[i];
for(LL i=2;i<=m;++i){h=0; t=0; q[h]=i-1;
for(LL j=i;j<=n;++j){
while(h<t&&slope(q[h],q[h+1])<2*s[j]) ++h;
f[j]=g[q[h]]+(s[j]-s[q[h]])*(s[j]-s[q[h]]);
while(h<t&&slope(q[t],q[t-1])>slope(j,q[t])) --t;
q[++t]=j;
}::memcpy(g,f,sizeof(g));
}printf("%lld",f[n]*m-s[n]*s[n]);
}

被莫名的非主观因素的TLE卡掉好多下午的学(tui)习(fei)时间, 心情并不怎么好...

不过下雪了出去玩了一圈就非常爽了~ (⊙v⊙)嗯

【笔记篇】斜率优化dp(二) SDOI2016征途的更多相关文章

  1. 一本通提高篇——斜率优化DP

    斜率优化DP:DP的一种优化形式,主要用于优化如下形式的DP f[i]=f[j]+x[i]*x[j]+... 学习可以参考下面的博客: https://www.cnblogs.com/Xing-Lin ...

  2. 学习笔记:斜率优化DP

    作为数学渣,先复习一下已知两点\((x_1, y_1)\), \((x_2, y_2)\),怎么求过两点的一次函数的斜率... 待定系数法代入 \(y = kx + b\) 有: \(x_1k + b ...

  3. hdu3507 斜率优化学习笔记(斜率优化+dp)

    QWQ菜的真实. 首先来看这个题. 很显然能得到一个朴素的\(dp\)柿子 \[dp[i]=max(dp[i],dp[j]+(sum[i]-sum[j])^2) \] 但是因为\(n\le 50000 ...

  4. 「学习笔记」斜率优化dp

    目录 算法 例题 任务安排 题意 思路 代码 [SDOI2012]任务安排 题意 思路 代码 任务安排 再改 题意 思路 练习题 [HNOI2008]玩具装箱 思路 代码 [APIO2010]特别行动 ...

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

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

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

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

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

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

  8. 【笔记篇】斜率优化dp(一) HNOI2008玩具装箱

    斜率优化dp 本来想直接肝这玩意的结果还是被忽悠着做了两道数论 现在整天浑浑噩噩无心学习甚至都不是太想颓废是不是药丸的表现 各位要知道我就是故意要打删除线并不是因为排版错乱 反正就是一个del标签嘛并 ...

  9. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  10. 斜率优化DP学习笔记

    先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...

随机推荐

  1. The 2019 Asia Nanchang First Round Online Programming Contest(B,E)

    B. Fire-Fighting Hero 题意:一个消防员和多个队伍比赛,比较所有地方的最短路的最大值,消防员最后的值要乘1/C,求胜利的一方的最短路的最大值是多少.一直没读懂正确题意(内疚). 思 ...

  2. webpack中代理配置(proxyTable)

    注:用axios请求 1,下载axios npm i axios --save 2,在config文件下的index.js中配置代理地址 参考:https://vuejs-templates.gith ...

  3. 【Java多线程系列四】控制线程执行顺序

    假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...

  4. VS2015 定时服务及控制端

    一.  服务端 如下图—新建项目—经典桌面—Windows服务—起名svrr 2. 打到server1 改名为svrExecSqlInsert 右击对应的设计界面,添加安装服务目录结构如图 3. sv ...

  5. mysql-python不支持python3

    使用Mysqlclient pip3 install Mysqlclient

  6. 45-Ubuntu-用户管理-10-chmod修改文件|目录权限

    1.将a.py的权限修改为u=rwx, g=r-x, o=r--. 2.将目录test及子目录和文件权限修改为u=rwx, g=rwx, o=r-x.

  7. Mac OS X终端的常用操作命令(UNIX指令)

    用了十多年windows,终于换了个高配Mac,俗话说 无论前端还是后端最终还是走向了linux,无论是换了多少台PC最终都会走向Mac.不学习命令行用什么Mac? 干就完了~ pwd 显示现在的文件 ...

  8. centos 时区设置初认识

    由于一些需要,我租用了一个海外服务器,并开始了我的centos之旅. 由于之前一直用虚拟机,而且在国内,所以不需要考虑时区的问题,但是现在,这个服务器是在海外的,所以就必须考虑时区的问题了.更何况我的 ...

  9. 自行制作yum源仓库

    背景 客户服务器为内网机器,centos7系统,且无法与外网连接.需要部署对应的LANMP环境及其它软件 解决思路 1.在阿里云服务器,利用阿里云的yum源仓库,下载对应软件及关联软件. 2.在客户机 ...

  10. jQuery-介绍 加载 选择器 样式操作 属性操作 绑定click事件

    jQuery - 介绍 加载 选择器 样式操作 属性操作 绑定click事件 注意:以下部分问题不能实现效果,因该是单词拼写错误(少个t)或者没有加引号(“swing”)... jquery介绍 jQ ...