P4983-忘情【wqs二分,斜率优化】

正题

题目链接:https://www.luogu.com.cn/problem/P4983


题目大意

给出长度为nnn的序列xxx,记平均数为xˉ\bar{x}xˉ,要求将序列分成mmm段。
每一段[l,r][l,r][l,r]的值为
((∑i=lrxi×xˉ)+xˉ)2xˉ2\frac{((\sum_{i=l}^rx_i\times \bar x)+\bar x)^2}{\bar x^2}xˉ2((i=lrxi×xˉ)+xˉ)2

求所有段的值和最小

1≤m≤n≤105,1≤xi≤10001\leq m\leq n\leq 10^5,1\leq x_i\leq 10001mn105,1xi1000


解题思路

直接除以xˉ2\bar x^2xˉ2就是最小化(∑i=lrxi+1)2(\sum_{i=l}^rx_i+1)^2(i=lrxi+1)2的和。

然后这个问题是下凸函数,设f(i)f(i)f(i)表示恰好分成iii段,那么显然段数越多答案越小而且每次减少的越少。

所以我们可以用wqswqswqs二分给每次分一个段加上一个权值valvalval

那么现在的转移就是
Fi=min{Fj+(si−sj+1)2+val}(j<i)F_i=min\{F_j+(s_i-s_j+1)^2+val\}(j<i)Fi=min{Fj+(sisj+1)2+val}(j<i)

这是经典的斜率优化不过多赘述。

时间复杂度O(nlog⁡W)O(n\log W)O(nlogW)WWW表示二分值域)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10;
ll n,m,s[N],f[N],g[N],x[N],y[N],q[N];
ll count(ll l,ll r)
{return f[l]+(s[r]-s[l]+1)*(s[r]-s[l]+1);}
ll xj(ll p,ll q,ll z)
{return (x[p]-x[z])*(y[q]-y[z])-(x[q]-x[z])*(y[p]-y[z]);}
ll check(ll val){int head=1,tail=0;q[++tail]=0;for(ll i=1;i<=n;i++){while(head<tail&&2ll*s[i]*(x[q[head+1]]-x[q[head]])>(y[q[head+1]]-y[q[head]]))head++;f[i]=count(q[head],i)+val;g[i]=g[q[head]]+1;y[i]=f[i]+s[i]*s[i]-2*s[i];x[i]=s[i];while(head<tail&&xj(i,q[tail],q[tail-1])>=0)tail--;q[++tail]=i;}return g[n];
}
signed main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&s[i]),s[i]+=s[i-1];ll l=0,r=1e18;while(l<=r){ll mid=(l+r)>>1;if(check(mid)<=m)r=mid-1;else l=mid+1;}check(l);printf("%lld\n",f[n]-l*m);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前瞻科技,引领未来!Microsoft Connect(); 2018即将重磅来袭!

怎么用一句话点燃全球的开发者&#xff1f;——Microsoft Connect(); 2018即将重磅来袭&#xff01;每一个观点都能引发科技狂潮&#xff0c;每一项技术都将提速技术进程&#xff0c;由微软举办的 Microsoft Connect(); 2018 即将在太平洋时间12月4日8:30拉开帷幕&#xff01;大…

2021“MINIEYE杯”中国大学生算法设计超级联赛(7)Yiwen with Formula(任意模数FFT)

Yiwen with Formula 溢流眼泪题解 生成函数化成n个多项式乘积&#xff0c;然后分治把他们依次相乘&#xff0c;需要由于指数需要modϕ(998244353)998244353−1\bmod \phi(998244353)998244353-1modϕ(998244353)998244353−1&#xff0c;因此需要任意模数的FFT。。。 常数贼大…

牛客题霸 [ 孩子们的游戏] C++题解/答案

牛客题霸 [ 孩子们的游戏] C题解/答案 题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开…

4.1模拟报告

总结 做的很坎坷。。。 一些细节上的玄学bug &#xff08;上次也一样。。。&#xff09; 还是要加强基础&#xff01;&#xff01;&#xff01; T1 x的实根 不贴了&#xff0c;就是水题。。。 T2 二分查找 就是lowerbound T3逆序对 1.树状数组 2.归并排序 注意&#xff…

P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】

正题 题目链接:https://www.luogu.com.cn/problem/P5048 题目大意 就是这个 【QA】区间众数&#xff0c;但空间很小 长度为nnn的序列&#xff0c;要求支持查找区间众数出现次数。 强制在线 1≤n,m≤51051\leq n,m\leq 5\times 10^51≤n,m≤5105 解题思路 空间小就不能用蒲公…

2021牛客暑期多校训练营7 J-xay loves Floyd(最短路+bitset优化集合交)

J-xay loves Floyd ANJHZ题解 abcdhhhh_题解 如果di,jwi,j\text d_{i,j}\text w_{i,j}di,j​wi,j​,那么按照题意中的算法仍然能得到正确的结果。此时记cani,j1\text{can}_{i,j}1cani,j​1。 如果存在vvv&#xff0c;使得①cani,v1\text{can}_{i,v}1cani,v​1②canv,j1\text{…

通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)

前言读完上篇《通俗易懂&#xff0c;C#如何安全、高效地玩转任何种类的内存之Span(一)》&#xff0c;相信大家对span的本质应该非常清楚了。含着金钥匙出生的它&#xff0c;从小就被寄予厚望要成为.NET下编写高性能应用程序的重要积木&#xff0c;而且很多老前辈为了接纳它&…

4.6模拟 宽度优先搜索

总结 bfs除了代码能力没有任何算法。。。 有些细节是值得注意的 T1 面积(area) bfs被我写成了dfs。。。 &#xff08;不过我觉得这么写挺不戳&#xff09; 核心思路就是用一个flag记录当前跑得这些点有没有效 恶心之处在于本题默认mn10&#xff01;&#xff01;&#xff01;…

牛客题霸 [ 有重复项数字的所有排列] C++题解/答案

牛客题霸 [ 有重复项数字的所有排列] C题解/答案 题目描述 给出一组可能包含重复项的数字&#xff0c;返回该组数字的所有排列。 题解&#xff1a; 很多人应该都是用的递归方式来做&#xff0c;这里介绍一个stl的next_permutation 在头文件里&#xff0c;可以产生全排列 ne…

2021牛客暑期多校训练营7 F-xay loves trees(线段树+滑动窗口)

F-xay loves trees 考虑在树1中满足条件的一些点&#xff0c;首先不难想到一定是一条链&#xff0c;其次如果点uuu被选择那么在树2以uuu为根的子树的点就禁止被选&#xff0c;于是只需区间&#xff0c;然后查询区间最值是否存在>1也就是树2中覆盖次数超过2的节点即可。 首…

微软开发者大会:VS 2019 Preview 发布;Windows UX 主要技术开源

美国当地时间12月4日&#xff0c;微软正式举行 Microsoft Connect(); 2018 开发者大会&#xff0c;本次大会的 slogan 是"Build the apps of tomorrow, today."。在今年的大会上&#xff0c;看得出来微软不是憋了一个 —— 而是憋了一波大招。不妨先看一下这次大会微…

不止代码:迷宫问题(bfs)

题目描述 如下图所示&#xff0c;给出一个N*M的迷宫图和一个入口、一个出口。 编一个程序&#xff0c;打印一条从迷宫入口到出口的路径。这里黑色方块的单元表示走不通&#xff08;用-1表示&#xff09;&#xff0c;白色方块的单元表示可以走&#xff08;用0表示&#xff09;。…

asp.net core sdk runtime 镜像[已更新至2.2.0]

在官方镜像的脚本上&#xff0c;增加了System.Drawing相关的依赖库以北京时间为默认的时间2.2.0Windows SDK地址:官方: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/2.2.100/dotnet-sdk-2.2.100-win-x64.exe自己的加速地址: http://file.niusys.com/dotnet-sdk-2.2.10…

P7726-天体探测仪(Astral Detector)【构造】

正题 题目链接:https://www.luogu.com.cn/problem/P7726 题目大意 一个长度为nnn的排列&#xff0c;给出nnn个可重集SiS_iSi​表示所有长度为iii的区间的最小值构成的集合。 求构造这个排列。 1≤n≤8001\leq n\leq 8001≤n≤800 解题思路 对于一个数字&#xff0c;如果在S…

牛客题霸 [ 大数乘法] C++题解/答案

牛客题霸 [ 大数乘法] C题解/答案 题目描述 以字符串的形式读入两个数字&#xff0c;编写一个函数计算它们的乘积&#xff0c;以字符串形式返回。 &#xff08;字符串长度不大于10000&#xff0c;保证字符串仅由’0’~9’这10种字符组成&#xff09; 题解&#xff1a; 高精…

2021牛客暑期多校训练营5 D-Double Strings(dp+组合数)

D-Double Strings fi,jf_{i,j}fi,j​表示a中前i个字符&#xff0c;b中前j个字符相同子序列的数量&#xff0c;容斥转移 fi,jfi−1,jfi,j−1−fi−1,j−1{(1fi−1,j−1)[aiaj]}f_{i,j}f_{i-1,j}f_{i,j-1}-f_{i-1,j-1}\{(1f_{i-1,j-1})[a_ia_j]\}fi,j​fi−1,j​fi,j−1​−fi−1…

模板:强连通分量

总结 缩点是强连通分量的精髓 它能将任意图转化为一个有向无环图 然后就常常伴随有拓扑排序和dp传值 代码较长&#xff0c;重在理解awa 代码 &#xff08;本题dp是求经过点权之和最大的可重复路径的权值&#xff09; #include<bits/stdc.h> using namespace std; con…

[翻译] 使用 Visual Studio 2019 来提高每个开发人员的工作效率

原文: Making every developer more productive with Visual Studio 2019今天&#xff0c;在 Microsoft Connect(); 2018 的主题演讲中&#xff0c;Scott Guthrie 宣布推出 Visual Studio 2019 Preview 1。这是 Visual Studio 下一个主要版本的首次预览。在本预览版中&#xff…

P1791-[国家集训队]人员雇佣【最大权闭合图】

正题 题目链接:https://www.luogu.com.cn/problem/P1791 题目大意 有nnn个人&#xff0c;雇佣第iii个需要AiA_iAi​的费用&#xff0c;对于Ei,jE_{i,j}Ei,j​表示如果iii选了的话&#xff0c;选择jjj会获得Ei,jE_{i,j}Ei,j​的费用&#xff0c;不选jjj会花费Ei,jE_{i,j}Ei,j​…

牛客题霸 [ 寻找峰值] C++题解/答案

牛客题霸 [ 寻找峰值] C题解/答案 题目描述 山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums&#xff0c;任意两个相邻元素值不相等&#xff0c;数组可能包含多个山峰。找到索引最大的那个山峰元素并返回其索引。 假设 nums[-1] nums[n] -∞。 题解&a…