洛谷题目传送门

一开始肯定要把题目要求的式子给写出来

我们知道方差的公式\(s^2=\frac{\sum\limits_{i=1}^{m}(x_i-\overline x)^2}{m}\)

题目要乘\(m^2\)再输出,于是

\(m^2s^2=m\sum\limits_{i=1}^{m}(x_i-\overline x)^2\)

\(=m(\sum\limits_{i=1}^{m}x_i^2-2\overline{x}\sum\limits_{i=1}^{m}x_i+m\overline{x}^2)\)

\(=m\sum\limits_{i=1}^{m}x_i^2-(\sum\limits_{i=1}^{m}x_i)^2\)

于是只要最小化\(\sum\limits_{i=1}^{m}x_i^2\)即可。

然而选\(m\)段非常不好办。这时候可以联想到凸优化。设\(G_m\)表示选\(m\)段\(\sum\limits_{i=1}^{m}x_i^2\)的最小值,当\(m\)增大的时候\(G_m\)显然会减小,凭蒟蒻的感性理解,多分出一段对答案的影响幅度也越来越小,也就是说\(G_x\)关于\(x\)的函数图像大概是下凸的。

我们用一个斜率为\(mid\)的直线去切这个凸包。显然\(mid\)的下界取\([0,1]\)之间的斜率,是总路程平方级别的,上界是\(0\)。因为切线在凸包的下方,所以多选一段的代价不是\(+mid\)而是\(-mid\)。

update:蒟蒻弃用了用直线切凸包的理解方法,蒟蒻用导数思想理解DP凸优化的思路可以看这里

接下来就是斜率优化的过程。设\(f_i\)为前\(i\)条路的最优答案,\(x_i\)为路程长度的前缀和,写出转移方程

\(f_i=\min\limits_{j=0}^{i}\{f_j-2x_ix_j+x_j^2\}+x_i^2\)

决策\(j\)优于\(k\)当且仅当

\(f_j-2x_ix_j+x_j^2<f_k-2x_ix_k+x_k^2\)

\(\frac{f_j+x_j^2-f_k-x_k^2}{x_j-x_k}<2x_i\)

于是设\(y_i=f_i+x_i^2\),把决策看成点\((x_i,y_i)\),使用单调队列就OK了。注意这里要记\(c_i\)表示最优决策下将前\(i\)条路分出的段数。最后判断\(c_n\)与\(m\)的关系来调整斜率。

由于这一题的斜率肯定不会有小数,故也不必担心二分中的一些边界问题。

#include<cstdio>
#define RG register
#define R RG int
#define G c=getchar()
#define Calc(j,k) (y[j]-y[k])/(x[j]-x[k])
typedef long long LL;
const int N=3009;
int n,q[N],c[N];
double f[N],k[N],x[N],y[N];
inline int in(){RG char G;while(c<'-')G;R x=c&15;G;while(c>'-')x=x*10+(c&15),G;return x;
}
inline double sqr(RG double x){return x*x;
}
inline void work(R mid){//斜率优化R h,t,i;for(h=t=i=1;i<=n;++i){while(h<t&&k[h]<2*x[i])++h;f[i]=f[q[h]]+sqr(x[i]-x[q[h]])-mid;//每转移一次要减一下midy[i]=f[i]+sqr(x[i]);c[i]=c[q[h]]+1;//记录段数while(h<t&&k[t-1]>Calc(q[t],i))--t;k[t]=Calc(q[t],i);q[++t]=i;}
}
int main(){n=in();R m=in(),l,r,mid,i;for(i=1;i<=n;++i)x[i]=x[i-1]+in();l=-sqr(x[n]);r=0;//大致确定下界while(l<r){work(mid=(l+r+1)/2);//注意负数的下取整问题c[n]<=m?l=mid:r=mid-1;}work(l);printf("%.0lf\n",m*(f[n]+m*l)-sqr(x[n]));//先加回m*lreturn 0;
}

转载于:https://www.cnblogs.com/flashhu/p/9545380.html

洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)相关推荐

  1. 洛谷4072 SDOI2016征途 (斜率优化+dp)

    首先根据题目中给的要求,推一下方差的柿子. \[v\times m^2 = m\times \sum x^2 - 2 \times sum \times sum +sum*sum\] 所以\(ans ...

  2. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  3. 洛谷P3628 [APIO2010]特别行动队(斜率优化)

    传送门 先写出转移方程$$dp[i]=max\{dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c\}$$ 假设$j$比$k$更优,则有$$dp[j]+a*(s ...

  4. 洛谷3628 APIO2010特别行动队(斜率优化)

    考虑最普通的 d p dp dp d p [ i ] = m a x ( d p [ j ] + a ∗ ( s u m [ i ] − s u m [ j ] ) 2 + b ∗ ( s u m [ ...

  5. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  6. 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)

    题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...

  7. 洛谷P1182 数列分段Section II 二分答案

    洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值, ...

  8. P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分

    $ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...

  9. LibreOJ #2478.「九省联考 2018」林克卡特树 树形dp+带权二分

    题意 给出一棵n个节点的树和k,边有边权,要求先从树中选k条边,然后把这k条边删掉,再加入k条边权为0的边,满足操作完后的图仍然是一棵树.问新树的带权直径最大是多少. n,k≤3∗105n,k≤3∗1 ...

最新文章

  1. mybatis 源码分析, 初始化
  2. 如何评估深度学习模型效果?阿里工程师这么做
  3. Java中的引用与C中的指针
  4. CoSENT:特征式匹配与交互式匹配有多大差距?
  5. 2018年10月17日普级B组【模拟赛】
  6. java集合——队列和双端队列+优先级队列
  7. 笨办法学 Python · 续 练习 40:SQL 读取
  8. NumPy Beginner's Guide 2e 带注释源码 九、使用 Matplotlib 绘图
  9. u-boot环境的擦除,默认设置,批写入
  10. 物质的粒子应该是空心的
  11. 成功 Root ------ 红米note3
  12. 【关系模型相关概念】小楼一夜听春雨——数据库学习之路(3)
  13. datatables rows selected
  14. spring编程式和声明式事务控制
  15. 邮件中CC和BCC的含义
  16. 金融系统性风险的网络模型
  17. Msc.Marc的python开发#1
  18. 来不及细说,毕业三天靠Python兼职赚了两千
  19. 保存PictureBox绘制的图像
  20. 1037: 四则运算 C语言

热门文章

  1. 世界人工智能大会见闻
  2. 计算机考研是英语一还是英语二,关于考研英语一和英语二的区别
  3. oracle基本命令集合(2)--单行函数
  4. win10系统还原卡在“你好..”和无法打开这个应用无法使用内置管理员的解决办法
  5. 一文了解BTS432E2
  6. HUD(抬头显示)的方案介绍
  7. php 文章采集源码,php文章采集
  8. https 证书使用
  9. 华为v3服务器修改raid,华为服务器v3bios密码 华为rh5885v3做raid
  10. 用友t+畅捷通使用方法_北用友 南金蝶,谁才是中国财务软件的最强王者