#loj4274. 「KTSC 2022 R1」直方图
「KTSC 2022 R1」直方图
#4274. 「KTSC 2022 R1」直方图
标签: 传统 | 时间限制: 4000 ms | 内存限制: 1024 MiB |
注意事项
在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:
- C++(标准为 C++ 17 及以上)
请在提交源代码前添加 #include "histogram.h"。
题目描述
题目译自 2022년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사 T3 「히스토그램」
我们来考虑一个由 个底边平行于地面的矩形连续排列而成的直方图。每个矩形的宽度都是 ,并且从左到右第 个矩形的高度为整数 。
下图展示了一个可能的直方图示例。

在这个直方图中,我们希望找到不超过 个的矩形,这些矩形的底边平行于地面,且除了顶点和边之外的区域不重叠,并且每个边的长度都是整数,使得这些矩形的面积之和最大。这个值记为 。 请编写一个程序来计算 。
实现细节
你需要实现以下函数:
vector<long long> max_area(vector<int> H);
- 该函数只会被调用一次。
- 参数中给定的整数数组 的大小为 。数组的每个元素 表示从左到右第 个矩形的高度 。
- 该函数返回一个大小为 到 的数组 。 中应存储 的值。请注意,数组 的大小会影响评分标准。
注意,提交的代码中不应包含任何输入输出操作。
样例 1
考虑 的情况。
评测程序将调用如下函数:
max_area([3,2,1,2,1,4,3]) = [7,11,13]
下图展示了对于 时面积之和最大的情况之一。

如果 max_area 函数返回 [7, 11],则 和 都正确,可以根据子任务的评分标准得分。
如果 max_area 函数返回 [7, 12, 13],则尽管 和 正确,但 错误,因此得 分。
如果 max_area 函数返回 [7, 11, 14],则尽管 和 正确,但 错误,因此得 分。
这个样例满足子任务 的条件。
样例 2
考虑 的情况。
评测程序将调用如下函数:
max_area([1, 2, 3, 4, 5, 6, 7]) = [16, 21, 24]
这个样例满足所有子任务的条件。
样例 3
考虑 的情况。
评测程序将调用如下函数:
max_area([1, 3, 4, 3, 1]) = [9, 11, 12]
这个样例满足子任务 的条件。
数据范围与提示
对于所有输入数据,满足:
详细子任务附加限制及分值如下表所示。
| 子任务 | 分值 | 附加限制 |
|---|---|---|
| 无附加限制 |
评分标准
在 LibreOJ 上,我们只会对 均正确的解决方案评分
假设 max_area 函数返回的数组为 A。
如果 的大小不是 到 之间,则得 分。
根据子任务的标准,如果 中有任何一个值不正确,则得 分。
如果 的值都正确,则根据子任务的评分标准得分。
在上述标准中,「 正确」意味着 的大小至少为 并且 的值等于 。
每个子任务的分数是子任务所有数据的最小分数。
示例评测程序
示例评测程序按以下格式读取输入:
- 第 行:
- 第 行:
示例评测程序按以下格式输出:
- 第 行:
max_area函数返回的数组 中 的值
示例评测程序可能与实际评测程序不同。