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定律 估算的数据主要依赖于所能获得的数据和常识,有时还包括实践而不仅仅是理论.它常常作为一个大问题中的子问题,恰当地估算可以省去精确计算的时间和开销.在计算机领域, ...
随机推荐
- nginx&http 第二章 ngx 事件event配置等初始化
event事件模块,配置分为两层:ngx_events_module 事件模块 和 ngx_event_core_module 事件核心模块.ngx_events_module:模块类型NGX_COR ...
- binary hacks读数笔记(nm命令)
nm命令(names):输出包含三个部分:1 符号值.默认显示十六进制,也可以指定: 2 符号类型.小写表示是本地符号,大写表示全局符号(external); 3 符号名称. 例如:nm Simple ...
- Spring源码之IOC容器创建、BeanDefinition加载和注册和IOC容器依赖注入
总结 在SpringApplication#createApplicationContext()执行时创建IOC容器,默认DefaultListableBeanFactory 在AbstractApp ...
- switch,case语句易误区
switch case 语句语法格式如下: switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可 ...
- cephfs根据存储池显示df容量
前言 如果用cephfs比较多,应该都知道,在cephfs的客户端进行mount以后,看到的容量显示的是集群的总的容量,也就是你的总的磁盘空间是多少这个地方显示的就是多少 这个一直都是这样显示的,我们 ...
- Linux 升级内核开启 TCP BBR 有多大好处
前言 如果你有订阅一些科技新闻,应该会有看过内核在4.9当中加入了一个新的算法,来解决在有一定的丢包率的情况下的带宽稳定的问题,这个是谷歌为我们带来的干货,新的 TCP 拥塞控制算法 BBR (Bot ...
- 转载 Web前端开发 HTML设计 经验与技巧总结
文章目录1.限制input 输入框只能输入纯数字.限制长度.默认显示文字2.input输入框自动获取焦点3.用CSS让背景有透明度文字不变4.a标签禁止点击5.文字两种居中对齐6.设置一个元素一直在页 ...
- Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)
漏洞原理 Tomcat配置了两个Connecto,它们分别是HTTP和AJP. HTTP默认端口为8080,处理http请求:AJP默认端口8009,用于处理 AJP 协议的请求. AJP比http更 ...
- MySQL错误修复:Table xx is marked as crashed and last (automatic?) repair failed
问题一 Table xx is marked as crashed and last (automatic?) repair failed 有开发找到我,说数据库坏了,连不上数据库,看了下 MySQL ...
- ABBYY FineReader 15 PDF有哪些好用的功能?
ABBYY FineReader 15(Windows系统)OCR文字识别软件中的PDF编辑器,是一个对用户相当友好的编辑器,不仅可以在其中查看,搜索PDF文档,还可以用以编辑文本,添加备注,添加与删 ...