AcWing 330. 估算
大型补档计划
若 \(K = 1\),显然,\(B[i]\) 取 \(A\) 序列的中位数时最优。
考虑扩展,我们只需要把 \(A\) 分成 \(K\) 段,每段内, \(B\) 最优的取值即这一段的中位数
设 \(g(l, r)\) 为 \([l, r]\) 这一段 A 数组序列的中位数
设 \(f[i][j]\) 为把前 \(i\) 个数分成 \(j\) 段的最小值。
考虑枚举一个 \(k < i\)
\(f[i][j] = min(f[k][j - 1] + g(k + 1, i))\)
若朴素计算 g,则复杂度 O(N ^ 3K)
从大往小枚举 k。
我们需要一个数据结构支持两个操作:
加入一个数 a[k + 1]
查询集合中所有数与中位数差的绝对值。
这就是动态中位数那道题,可以用对顶堆 / 线段树 / 平衡树,由于对顶堆比较好写就用它了。
然后复杂度就是 \(O(N ^ 2KLogN)\)。但是复杂度还是 \(1e9\) 左右,会暴毙。
考虑 \(g(k + 1, i)\) 不随 j 的变化而变化,所以可以预处理 \(g(k + 1, i)\) (时间复杂度\(O(N^2LogN)\))
复杂度就是\(O(N ^ 2K) 1e8\) 跑的还是很慌 #只有吸氧才能过哇哇哇
#pragma GCC optimize(2)
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#define rint register int
using namespace std;
const int N = 2005, S = 26;
int n, K, a[N], s1, s2, f[N][S], g[N][N];
priority_queue<int> q1; // 大跟堆
priority_queue<int, vector<int>, greater<int> > q2; // 小跟堆
void inline clear() {
while (q1.size()) q1.pop();
while (q2.size()) q2.pop();
s1 = s2 = 0; }
void inline insert(int x) {
if (q1.empty() || x <= q1.top()) q1.push(x), s1 += x;
else q2.push(x), s2 += x;
// 保持 q1.size == q2.size 或者 q1.size == q2.size + 1
if (q1.size() > q2.size() + 1) {
s2 += q1.top(), s1 -= q1.top();
q2.push(q1.top()), q1.pop();
} else if (q2.size() > q1.size()) {
s1 += q2.top(), s2 -= q2.top();
q1.push(q2.top()), q2.pop();
}
}
int inline query() {
int s = 0;
if (q1.size()) s += q1.top() * q1.size() - s1;
if (q2.size()) s += s2 - q1.top() * q2.size();
return s;
}
int main() {
while (scanf("%d%d", &n, &K), n || K) {
memset(f, 0x3f, sizeof f);
for (rint i = 1; i <= n; i++) scanf("%d", a + i);
for (rint i = 1; i <= n; i++) {
clear();
for (int k = i; k; k--)
insert(a[k]), g[k][i] = query();
}
f[0][0] = 0;
for (rint i = 1; i <= n; i++) {
for (rint j = 1; j <= K; j++)
for (rint k = 0; k < i; k++)
f[i][j] = min(f[i][j], f[k][j - 1] + g[k + 1][i]);
}
printf("%d\n", f[n][K]);
}
return 0;
}
AcWing 330. 估算的更多相关文章
- 1Z0-053 争议题目解析330
1Z0-053 争议题目解析330 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 330.What will be the end result of this set of RM ...
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- Hadoop map和reduce数量估算
Hadoop在运行一个mapreduce job之前,需要估算这个job的maptask数和reducetask数.首先分析一下job的maptask数,当一个job提交时,jobclient首先分析 ...
- mysql时该如何估算内存的消耗,公式如何计算?
经常有人问配置mysql时该如何估算内存的消耗.那么该使用什么公式来计算呢? 关心内存怎么使用的原因是可以理解的.如果配置mysql服务器使用太少的内存会导致性能不是最优的;如果配置了太多的内存则会导 ...
- Oracle Flashback Technologies - 估算不同时间段闪回日志的产生量
Oracle Flashback Technologies - 估算不同时间段闪回日志的产生量 v$flashback_database_stat监控闪回数据的i/o开销的统计信息,根据之前的系统负载 ...
- hadoop集群的故障概率估算
hadoop集群的机器数业界(国内)最大的在5000左右,是什么限制了集群的规模呢?有好几个原因. 1. namenode的内存大小限制 2. 机器故障概率随着机器数目增大而增大,通常一份数据存储在h ...
- Wafer管芯数量及成本估算
芯片流片费用一般不按颗数计价,现在流片主要分为全晶圆和MPW两种方式. MPW是现在很流行的一种tapout方法,主要是按晶圆面积来均分价格. 如果是整个wafer的话,成本主要是wafer费 ...
- Spring IOC之 使用JSR 330标准注解
从Spring 3.0开始,Spring提供了对 JSR 330标准注解的支持.这些注解可以喝Spring注解一样被扫描到.你只需要将相关的Jar包加入到你的classpath中即可. 注意:如果你使 ...
- [珠玑之椟]估算的应用与Little定律
[珠玑之椟]估算的应用与Little定律 估算的数据主要依赖于所能获得的数据和常识,有时还包括实践而不仅仅是理论.它常常作为一个大问题中的子问题,恰当地估算可以省去精确计算的时间和开销.在计算机领域, ...
随机推荐
- shell编程之输入输出
1.输入 read命令有以下几种常见形式: read var :等待用户输入,从标准输入中读取一行并赋值给变量var read : 标准输入读取一行,并赋值给内置变量REPLY read -a a ...
- 基于udp的scoket通信
1.udp例子1 udpserver.py # udp的server,不需要进行监听也不需要建立连接 # 在启动服务之后只能被动的等待客户端发送消息过来 # 客户端发送消息的同时还会自带地址信息 # ...
- 深度学习论文翻译解析(十四):SSD: Single Shot MultiBox Detector
论文标题:SSD: Single Shot MultiBox Detector 论文作者:Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Sz ...
- Elasticsearch 国内镜像下载站
镜像地址:https://thans.cn/mirror/elasticsearch.html 支持 5.0.0~7.3.1 各个平台的各个版本. 本文章转载他人.
- Matlab项目经验分享-去除震荡点
Matlab是做科研是比较常用的建模工具,我在研一做项目期间遇到了一个还算比较基础的问题,所以我打算记录下来并分享出来! 处理问题步骤: 1. 抛出问题 2. 思考解决方法 3. 代码验证看结果 抛出 ...
- 如何防范CSRF攻击
上一篇文章了解了一下CSRF和XSS的区别,那么这次我们来看看怎么防范CSRF吧 首先,从上篇文章我们可以看得出,CSRF攻击是有着限制的,而我们可以使用这个限制来对他做相关的防范 方法1:后端在接收 ...
- 这个厉害了,阿里P7大佬都在看的SpringCloud 总结,帮你梳理全部知识点!
微服务 微服务架构是一种以一些微服务来替代开发单个大而全应用的方法,每一个小服务运行在自己的进程里,并以轻量级的机制来通信, 通常是 HTTP RESTful API.微服务强调小快灵, 任何一个相对 ...
- 解析MindMapper选项中的鱼骨选项
MindMapper思维导图可以画鱼骨图,而且完成的相当漂亮,我们可以在选项设置中定义鱼骨图图的默认样式.下面本文就分析了MindMapper选项中可以更改哪些鱼骨图设置. 我们首先打开MindMap ...
- 用思维导图软件iMindMap来提高记忆
虽说人的大脑是强大的存储器,但是我们终究没有挖掘出大脑全部的潜能,在记忆时或许因为方式.或许是干扰因素都能够影响我们的记忆力,致使有心无力,快来让思维导图来拯救你的记忆吧. 记忆是经验的关键,思维导图 ...
- zabbix的搭建及操作(4)实现邮件,钉钉,微信报警
实现邮件报警 网页版邮箱中开启 POP3/SMTP/IMAP 生成授权码并记录 Server端安装配置邮件服务器 1.Yum安装邮件服务器 yum -y install mailx dos2unix ...