[SDOI 2016]征途
Description
题库链接
将一个长度为 \(n\) 的正整数序列分为 \(m\) 段,问你这 \(m\) 段最小的方差 \(v\) 为多少。输出 \(v\times m^2\) 。
\(1\leq n\leq 3000\)
Solution
容易发现答案就是:
\[m^2\frac{\sum\limits_{i=1}^m(a_i-\overline{a})^2}{m}=m\sum\limits_{i=1}^m\left(a_i-\frac{\sum\limits_{i=1}^m a_i}{m}\right)^2\]
记 \(s=\sum\limits_{i=1}^m a_i\) ,
\[m\sum_{i=1}^m a_i^2-2s\sum_{i=1}^m a_i+s^2\]
这玩意就可以斜率优化了。
upd
做的时候制杖了...发现最后的式子还可以化成 \[m\sum_{i=1}^m a_i^2-s^2\]
Code
//It is made by Awson on 2018.3.19
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 3000;
void read(LL &x) {char ch; bool flag = 0;for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());x *= 1-2*flag;
}
void print(LL x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(LL x) {if (x < 0) putchar('-'); print(Abs(x)); }LL n, m, sum[N+5], s;
LL f[N+5][N+5];
int q[N+5], head, tail;LL deltax(int p, int q) {return m*2*(sum[q]-sum[p]); }
LL deltay(int p, int q) {return m*sum[q]*sum[q]-m*sum[p]*sum[p]+s*2*sum[q]-s*2*sum[p]; }
void work() {read(n), read(m); for (int i = 1; i <= n; i++) read(sum[i]), sum[i] += sum[i-1];s = sum[n]; memset(f, 127/3, sizeof(f));f[0][0] = 0;for (int i = 1; i <= m; i++) {head = tail = 0; q[tail++] = 0;for (int j = 1; j <= n; j++) {while (tail-head > 1 &&f[i-1][q[head+1]]-f[i-1][q[head]]+deltay(q[head], q[head+1]) <=sum[j]*deltax(q[head], q[head+1])) ++head;f[i][j] = f[i-1][q[head]]+m*(sum[j]-sum[q[head]])*(sum[j]-sum[q[head]])-(sum[j]-sum[q[head]])*2*s;while (tail-head > 1 &&(f[i-1][q[tail-1]]-f[i-1][q[tail-2]]+deltay(q[tail-2], q[tail-1]))*deltax(q[tail-1], j) >=(f[i-1][j]-f[i-1][q[tail-1]]+deltay(q[tail-1], j))*deltax(q[tail-2], q[tail-1])) --tail;q[tail++] = j;}}writeln(f[m][n]+s*s);
}
int main() {work(); return 0;
}
转载于:https://www.cnblogs.com/NaVi-Awson/p/8605600.html
[SDOI 2016]征途相关推荐
- 【SDOI 2016】征途
传送门 Problem 给出一个有 n n n 个数的序列 { a n } \{a_n\} {an},现要把它分成 m m m 段,设每段的权值为该段 a i a_i ai 之和,求出这 m m ...
- SDOI 2016 游戏
树链剖分 线段树维护区间最小值,区间最大值 更新,对于每一个区间,找到当前区间的最小值的最大值,和要更新的值比较,如果比最大值还大,则此数对于以后的询问无任何贡献,直接返回即可,若有贡献,则一直递归到 ...
- SDOI 2016 生成魔咒 题解
题目传送门 题目大意: 给出一个字符串,询问它的每一个前缀内包含多少个不同的子串. 题解 将字符一个一个加入到SAM里,每个新的字符的的贡献为 l e n ( x ) − l e n ( l i n ...
- 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做...
题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. 1 #include <cstdlib> 2 ...
- 回顾4180天在腾讯使用C#的历程,开启新的征途
今天是2018年8月8日,已经和腾讯解除劳动关系,我的公司正式开始运营,虽然还有很多事情需要理清,公司官网也没有做,接下来什么事情都需要自己去完成了,需要一步一个脚印去完善,开启一个新的征途. 昨天是 ...
- 纪念张首晟教授:英魂长存于行行字迹 何惧漫漫征途
著名美国华裔科学家,美国斯坦福大学终身教授,张首晟教授因病于2018年12月1日在旧金山逝世,享年55岁. 为了追忆张首晟教授的生平,张教授家人在美国西部时间5月1日下午于斯坦福举办纪念活动,邀请社会 ...
- 中国云计算产业2016年度点评
版权声明:转载需全文转载并保留来源(微信公众号鸣北林techculture)和原文链接,并同时转载二维码,否则视作侵权. 谨慎点击,因为已经约定:这是一篇付费文章,200元一人,学生例外-20元.通过 ...
- 亚马逊云科技启示录:创新作帆,云计算的征途是汪洋大海
开篇:创新是亚马逊云科技发展的最持久驱动力 云计算,新世纪以来最伟大的技术进步之一,从2006年 Amazon Web Service 初创时的小试牛刀,到如今成长为一个巨大的行业和生态,已经走过16 ...
- AWS启示录:创新作帆,云计算的征途是汪洋大海
全文13100字,预计阅读时间15到20分钟. 开篇:创新是AWS发展的最持久驱动力 云计算,新世纪以来最伟大的技术进步之一,从2006年 Amazon Web Service(以下简称AWS)初创时 ...
最新文章
- 合格SEOER应该具备的能力
- 如何识别未使用的CSS定义[关闭]
- apache安装mod_ssl.so 出现 undefined symbol: ssl_cmd_SSLPassPhraseDialog错误解决
- CentOS 设置网络(修改IP 网关 DNS)上网
- DIP第三章习题解答
- 前端学习(1153):常量const01
- leetcode197. 上升的温度(SQL)
- html中超链接无效怎么办,超链接问题:“引用无效”怎么回事
- Hyper-v中安装centos网卡故障
- php基本语法(简略篇)
- 高仿京东分类页面实现
- 7-1 前序序列创建二叉树
- jmeter 接口测试 签名_JMeter处理接口签名(sign)
- php英文数字转为中文,利用PHP怎么将英文数字转换为阿拉伯数字
- Redis热点Key发现及常见解决方案总结
- WINDOWS远程连接显示“请稍后”
- 面试题:两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
- 哈工大SCIR出品《自然语言处理》新书,无套路送5本!
- 2017年研究生数学建模优秀论文汇总
- 从零开始搭建 Filecoin 主网挖矿集群