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定律 估算的数据主要依赖于所能获得的数据和常识,有时还包括实践而不仅仅是理论.它常常作为一个大问题中的子问题,恰当地估算可以省去精确计算的时间和开销.在计算机领域, ...
随机推荐
- mysql之冷备和mysqldump、mydumper、xtrabackup备份
1.冷备流程: 停库备份,冷备份一般用于非核心业务,这类业务一般都允许停库. 在停止数据库后,将数据文件拷贝出来,然后对原始数据文件进行备份. 流程: 1.关闭数据库备份 2.拷贝数 ...
- 练习启动各种浏览器的同时加载插件:Firefox, Chrome, IE
# -*- coding:utf-8 -*-import osimport seleniumfrom selenium import webdriverfrom selenium.webdriver. ...
- SQL SERVER数据库Left Join用法
Left Join基本语法: SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的 ...
- 关于点击弹框外部区域弹框关闭的交互处理(前端JS)
常见需求场景 前端在处理交互的时候,经常遇到这样的场景,点击一个按钮,出现一个弹框,点击外部区域,弹框关闭. 解决方法 思路说明: 1.给弹框的div父级都加个类名,如: 2.在document绑定一 ...
- [web安全原理分析]-SSRF漏洞入门
SSRF漏洞 SSRF漏洞 SSRF意为服务端请求伪造(Server-Side Request Forge).攻击者利用SSRF漏洞通过服务器发起伪造请求,就这样可以访问内网的数据,进行内网信息探测或 ...
- Navicat总是提示主键不存在问题
Windows 和 Linux:打开navicat > 找到工具 > 点击选项- > 外观 > 点击数据 & 网格 > 取消勾选显示主键警告 > 确定. M ...
- guitar pro系列教程(十四):Guitar Pro教程之创建新乐谱后的设置
前面的章节我们有对Guitar Pro的单个功能作介绍,对于初学作曲,且又是吉他初学者的朋友们来说,学完这些功能介绍,自己还不能融会贯通起来,创建了一个新的乐谱后,但是看起来还不是很满意,今天我们就创 ...
- guitar pro 系列教程(十一):Guitar Pro菜单工具之MIDI效果的提升
对于新手的一些朋友,看谱,编曲时使用Guitar Pro时,因为对其功能不是很了解而显得困难重重,导致出现的音频效果不是很理想,因此,小编今天要做的便是,单独把Guitar Pro里的MIDI效果如果 ...
- 线程池中状态与线程数的设计分析(ThreadPoolExecutor中ctl变量)
目录 预备知识 源码分析 submit()源码分析 shutdownNow()源码分析 代码输出 设计目的与优点 预备知识 可以先看下我的另一篇文章对于Java中的位掩码BitMask的解释. 1.一 ...
- 9、Spring Boot安全
1.Spring Security简介 Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型.他可以实现强大的web安全控制.对于安全控 ...