Luogu4983 忘情

定义序列 \(x_1,\ x_2,\ \cdots,\ x_n\) 的值为 \(\frac{((\displaystyle\sum_{k=1}^nx_k\times \bar x) + \bar x)^2}{\bar x^2}\)

给定一段序列 \(a_1,\ a_2,\ \cdots,\ a_n\) ,将它分成 \(m\) 段,使每段值的和最小,求这个最小值

\(m\leq n\leq10^5,\ 1\leq a_i\leq1000\)

wqs二分+斜率优化


首先考虑不限制段数,斜率优化即可

原式 \(=(1+\displaystyle\sum_{k=1}^nx_i)^2\)

令 \(s_i=\displaystyle\sum_{k=1}^ia_k\)

列出 \(dp\) 方程 $$f_i=\displaystyle\min_{j<i}{f_j+(s_i-s_j+1)^2}$$

去掉 \(\min\),套路化简得 $$f_j=(2s_i+1)s_j+f_i-s_i^2-2s_i-1$$

然后用单调队列维护下凸包~

然后考虑如何限制段数

感性地理解或者打表观察或者严格的数学证明可以发现:如果我们给每个 \(f_i\) 值都强行加上一个增量 \(w\),因为要最小化 \(f_i\),那么 \(w\) 越大,总段数就会越少

所以我们可以二分这个重物 \(val\),斜率优化做一遍 \(dp\),同时记录一下划分段数 \(c_i\),然后判断划分的总段数\(c_n\) 与 \(m\) 的大小关系。如果 \(cnt_n>m\) 就说明 \(val\) 不够大,要调大。

时间复杂度 \(O(n\log w)\)

代码

#include <bits/stdc++.h>
using namespace std; typedef double db;
typedef long long ll;
const int maxn = 1e5 + 10;
int n, m, c[maxn], q[maxn]; ll s[maxn], f[maxn]; ll sqr(ll x) { return x * x; }
db slope(int x, int y) {
return db(f[x] - f[y] + sqr(s[x]) - sqr(s[y])) / db(s[x] - s[y]);
} bool check(ll x) {
int l = 1, r = 1; q[1] = 0;
for (int i = 1; i <= n; i++) {
while (l < r && slope(q[l], q[l + 1]) < 2.0 * (s[i] + 1)) l++;
f[i] = f[q[l]] + sqr(s[i] - s[q[l]] + 1) + x, c[i] = c[q[l]] + 1;
while (l < r && slope(q[r - 1], q[r]) > slope(q[r], i)) r--;
q[++r] = i;
}
return c[n] > m;
} int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%lld", s + i), s[i] += s[i - 1];
}
ll l = 0, r = sqr(s[n]) + s[n], mid, res;
while (l < r) {
check(mid = l + r >> 1) ? l = mid + 1 : r = res = mid;
}
check(res);
printf("%lld", f[n] - 1ll * res * m);
return 0;
}

Luogu4983 忘情的更多相关文章

  1. [总结] wqs二分学习笔记

    论文 提出问题 在某些题目中,强制规定只能选 \(k\) 个物品,选多少个和怎么选都会影响收益,问最优答案. 算法思想 对于上述描述的题目,大部分都可以通过枚举选择物品的个数做到 \(O(nk^2)\ ...

  2. P4983忘情

    今天挺开心的\(\sim\),省选加油\(!\) \(P4893\)忘情 我能说今晚我才真正学会\(wqs\)和斜率优化吗\(?\) 恰好选几个,必然需要\(wqs\)二分一下 那么考虑不考虑次数情况 ...

  3. 洛谷T51924 忘情

    二分上界有多大开多大 二分上界有多大开多大 二分上界有多大开多大 重要的事情说三遍 又被bright神仙带着做题了 先无脑上wqs二分 我们可以把这个柿子画一下,区间的花费就变成((sigema(l~ ...

  4. 洛谷P4983 忘情 (WQS二分+斜率优化)

    题目链接 忘情水二分模板题,最优解对划分段数的导数满足单调性(原函数凸性)即可使用此方法. 详细题解洛谷里面就有,不啰嗦了. 二分的临界点让人有点头大... #include<bits/stdc ...

  5. B 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)

    最熟悉的陌生人 作者:张慧桥 枪与玫瑰 我看了一下聊天室的名单,哈哈哈,我不禁喜出望外:蝶恋花那丫头片子挂在线上呢,真是天助我也.初时的担心一扫而光,我精神抖擞地喝下一大口咖啡,猛抽了三口烟,现在的我 ...

  6. 详解Bootstrap面板组件

    面板组件主要作用是用来处理一些其他组件无法完成的功能,在不同的版本中具有不同的源码: LESS:panels.less SASS:_panels.scss 基础面板非常简单,就是一个div容器中运用了 ...

  7. [ZZ] Cache

    http://blog.sina.com.cn/s/blog_6472c4cc0102duzr.html 处理器微架构访问Cache的方法与访问主存储器有类似之处.主存储器使用地址编码方式,微架构可以 ...

  8. Linux就这个范儿 第12章 一个网络一个世界

    Linux就这个范儿 第12章 一个网络一个世界 与Linux有缘相识还得从一项开发任务说起.十八年前,我在Nucleus  OS上开发无线网桥AP,需要加入STP生成树协议(SpanningTree ...

  9. 奇葩app大盘点,你知道几个

    1.I'm Rich 这个App最奇葩.不仅奇葩,还无聊.炫富.浮夸,曾经荣耀一时的"劳资是土豪"应用,售价999.99美元,功能和它的简介一样粗暴,999美元买来的红钻石就是土豪 ...

随机推荐

  1. es6 语法 (let 和const)

    一.let 和const 1.let 只在自己声明的块作用域中有效: function test(){ let a = 'a'; var b = 'b'; for(let i =1;i<3;i+ ...

  2. JavaScript之Number、String、Array常用属性与方法手册

    Number isFinite函数 Number.isFinite() 方法用来检测传入的参数是否是一个有穷数(finite number). 语法: Number.isFinite(value) 例 ...

  3. CentOS7系统搭建外网环境

    理一下思路第一步 Vultr 注册 充值10刀了: 可以支付宝支付.不再需要绑定银行卡 第二步 选择 一个自己中意的款 系统啊流量之类的购买     Deploy New Instance 第三步  ...

  4. Dynamics 365工作流报错:您无法登陆系统。原因可能是您的用户记录或您所属的业务部门在Microsoft Dynamics 365中已被禁用。

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复265或者20170926可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  5. ViewPager结合view无限滑动

    使用viewPager进无限滑动,这里的实现是在适配器里面进行,当然在外头使用滑动监听也行. import android.support.v4.view.PagerAdapter; import a ...

  6. WangleEditor3提交数据(servlet-jsp)

    用servlet提交 WangEditor3编辑的内容,找了很多资料没发现,大多用的框架,今天终于解决了,记录一下. WangEditor3不支持放在textarea中,servlet是无法直接获取到 ...

  7. Android P的APP适配总结,让你快人一步

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由QQ音乐技术团队发表于云+社区专栏 上篇:Android P 行为变更适配 Android P 这次有很多行为变更,其中不乏一些需要亟 ...

  8. 如何设置访问内网web项目

    1.若我的项目搭建在一个linux虚拟机上 2.在内网的一台电脑做以下配置 3.测试访问 ******************************************************* ...

  9. WARNING: Re-reading the partition table failed with error 22: Invalid argument

    在划分磁盘分区时,遇到错误"WARNING: Re-reading the partition table failed with error 22: Invalid argument&qu ...

  10. [20180814]慎用查看表压缩率脚本.txt

    [20180814]慎用查看表压缩率脚本.txt --//最近看exadata方面书籍,书中提供1个脚本,查看某些表采用那些压缩模式压缩比能达到多少.--//通过调用DBMS_COMPRESSION. ...