luogu#P11585. [KTSC 2022 R1] 直方图
[KTSC 2022 R1] 直方图
题目背景
请使用 C++17 或 C++20 提交本题
你需要在程序开头加入如下代码:
#include <vector>
std::vector<long long> max_area(std::vector<int> H);
题目译自 2022년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사 T3「 히스토그램」
题目描述
有一个由 个底边平行于地面的矩形连续排列而成的直方图。每个矩形的宽度都是 ,并且从左到右第 个矩形的高度为整数 。
下图展示了一个可能的直方图示例。
在这个直方图中,我们希望找到不超过 个矩形,这些矩形的底边平行于地面,且除了顶点和边之外的区域不重叠,并且每个边的长度都是整数,使得这些矩形的面积之和最大。这个值记为 。 请编写一个程序来计算 。
你需要实现以下函数:
vector<long long> max_area(vector<int> H);
- 该函数只会被调用一次。
- 参数中给定的整数数组 的大小为 。数组的每个元素 表示从左到右第 个矩形的高度 。
- 该函数返回一个大小为 的数组 。 中应存储 的值。请注意,数组 的大小会影响评分标准。
注意,提交的代码中不应包含任何输入输出操作。
输入格式
示例评测程序按以下格式读取输入:
- 第 行:
- 第 行:
输出格式
示例评测程序按以下格式输出:
- 第 行:
max_area
函数返回的数组 中 的值。
7
3 2 1 2 1 4 3
7
11
13
7
1 2 3 4 5 6 7
16
21
24
5
1 3 4 3 1
9
11
12
提示
评分标准
假设 max_area
函数返回的数组为 。
如果 的大小不是 到 之间,则得 分。
根据子任务的标准,如果 中有任何一个值不正确,则得 分。
如果 的值都正确,则根据子任务的评分标准得分。
在上述标准中, 正确意味着 的大小至少为 并且 的值等于 。
每个子任务的分数是子任务所有数据的最小分数。
样例解释 #1
考虑 的情况。
评测程序将调用如下函数:
max_area([3,2,1,2,1,4,3])=[7,11,13]
下图展示了对于 时面积之和最大的情况之一。
如果 max_area
函数返回 ,则 和 都正确,可以根据子任务的评分标准得分。如果 max_area
函数返回 ,则尽管 和 正确,但 错误,因此得 分。如果 max_area
函数返回 ,则尽管 和 正确,但 错误,因此得 分。
这个样例满足子任务 的条件。
样例解释 #2
考虑 的情况。
评测程序将调用如下函数:
max_area([1,2,3,4,5,6,7])=[16,21,24]
这个样例满足所有子任务的条件。
样例解释 #3
考虑 的情况。
评测程序将调用如下函数:
max_area([1,3,4,3,1])=[9,11,12]
这个样例满足子任务 的条件。
数据范围
对于所有输入数据,满足:
详细子任务附加限制及分值如下表所示。
子任务 | 分值 | 约束 |
---|---|---|
无附加限制 |