正题

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


题目大意

给出长度为\(n\)的序列\(x\),记平均数为\(\bar{x}\),要求将序列分成\(m\)段。

每一段\([l,r]\)的值为

\[\frac{((\sum_{i=l}^rx_i\times \bar x)+\bar x)^2}{\bar x^2}
\]

求所有段的值和最小

\(1\leq m\leq n\leq 10^5,1\leq x_i\leq 1000\)


解题思路

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

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

所以我们可以用\(wqs\)二分给每次分一个段加上一个权值\(val\)。

那么现在的转移就是

\[F_i=min\{F_j+(s_i-s_j+1)^2+val\}(j<i)
\]

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

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


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;
}

最新文章

  1. Bootstrap学习应用
  2. window 系统设置无线wifi
  3. 浅析配置更快的Eclipse方法
  4. android: open failed: EACCES (Permission denied)
  5. HDU 4511 (AC自动机+状态压缩DP)
  6. hdu 2571 命运(递推,请小心)
  7. 关于CQRS(老外经典好文)
  8. 根据文字计算Label的尺寸
  9. PowerShell中的输出
  10. CEF小白人系列1-认识CEF
  11. JVM学习--(一)基本原理
  12. Java语言
  13. mybatis的插件分析
  14. 【windows核心编程】注入DLL时BUG排除与调试
  15. POJ-3279.Fliptile(二进制状态压缩 + dfs) 子集生成
  16. monobehaviour生命周期完整版
  17. 什么是REST编程
  18. Thinkphp --- 路由定义
  19. 马婕 2014MBA专硕考试 词汇每日一练(转)
  20. shutil的一些基本用法

热门文章

  1. C# 调用C++结构体
  2. 十八:使用JDBC进行批处理
  3. Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性
  4. Node.js &amp; Kubernetes Graceful Shutdown
  5. Linux基础——安装以及常用命令
  6. Dockerfile 实践及梳理
  7. Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务
  8. 《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)
  9. sublime text build system automatic ctrl/cmd+B自动选择 python2 或 python3
  10. 学习Linux tar 命令:最简单也最困难