博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SDOI2016]征途
阅读量:6579 次
发布时间:2019-06-24

本文共 1651 字,大约阅读时间需要 5 分钟。

题目大意:

  给你一个长度为n的数列,让你分成m段,使得每一段数字和的方差最小。
  输出最小方差*m*m。

思路:

  不难想到一个DP。
  设f[i][k]表示前i个数分成k段,则
  f[i][k]=std::min(f[i][k],m*sqr(sum[i])-2*sum[n]*sum[i]+f[j][k-1]+2*sum[n]*sum[j]-2*m*sum[i]*sum[j]+m*sqr(sum[j]));
  答案即为sqr(sum[n])+f[n][m]。
  复杂度O(n^3)。
  一开始把方程往奇怪的方向推,最后没弄出来斜率式。
  实际上如果我们用i和j表示可以被转移的两个状态,那么我们只需要维护一个关于斜率(f[i][!(k&1)]-f[j][!(k&1)]+sqr(sum[i])-sqr(sum[j]))/(sum[i]-sum[j])单调递增的队列。
  这样就可以优化到O(n^2)。

1 #include
2 #include
3 typedef long long int64; 4 inline int getint() { 5 register char ch; 6 while(!isdigit(ch=getchar())); 7 register int x=ch^'0'; 8 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 9 return x;10 }11 const int64 inf=0x7ffffffffffffffll;12 const int N=3001;13 int q[N],h,t;14 int64 sum[N],f[N][2];15 inline int64 sqr(const int64 &x) {16 return x*x;17 }18 inline double calc(const int &i,const int &j,const int &k) {19 return double(f[i][!(k&1)]-f[j][!(k&1)]+sqr(sum[i])-sqr(sum[j]))/double(sum[i]-sum[j]);20 }21 int main() {22 const int n=getint(),m=getint();23 for(register int i=1;i<=n;i++) sum[i]=sum[i-1]+getint();24 for(register int i=1;i<=n;i++) f[i][0]=inf;25 for(register int k=1;k<=m;k++) {26 q[h=t=0]=k-1;27 for(register int i=k;i<=n;i++) {28 while(h
<=2*sum[i]) h++;29 f[i][k&1]=f[q[h]][!(k&1)]+sqr(sum[i]-sum[q[h]]);30 while(h
<=calc(q[t],q[t-1],k)) t--;31 q[++t]=i;32 }33 }34 printf("%lld\n",f[n][m&1]*m-sqr(sum[n]));35 return 0;36 }

 

转载于:https://www.cnblogs.com/skylee03/p/8084788.html

你可能感兴趣的文章
Intellij IDEA 2018.2 搭建Spring Boot 应用
查看>>
SNMP AGENT函数介绍
查看>>
Git提交到多个远程仓库(多看两个文档)
查看>>
期末大作业
查看>>
[Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688
查看>>
【Android视图效果】分组列表实现吸顶效果
查看>>
title: postGreSQL 插件 timescaleDB 安装使用 date: 2019-02-14 18:02:23
查看>>
并发容器与框架——并发容器(一)
查看>>
网络编程socket
查看>>
学界 | 伯克利最新研究:用算法解决算法偏差?公平机器学习的延迟影响
查看>>
多文件上传示例源码(默认支持各种类型,包括图片)
查看>>
JS 中如何判断 undefined 和 null
查看>>
9.2. CentOS 区域设置
查看>>
命令行基本操作学习笔记(一)
查看>>
「试着读读 Vue 源代码」工程目录及本地运行(断点调试)
查看>>
cocos2d-lua 开发环境搭建
查看>>
Oracle——16用户、角色和权限
查看>>
获得系统属性
查看>>
从0实现NavigationController
查看>>
A Visual Git Reference
查看>>