P11585 [KTSC 2022 R1] 直方图

题目背景

**请使用 C++17 或 C++20 提交本题** 你需要在程序开头加入如下代码: ```cpp #include std::vector max_area(std::vector H); ``` 题目译自 [2022년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사](https://www.ioikorea.kr/archives/ioitst/2022/) T3「 [히스토그램](https://assets.ioikorea.kr/ioitst/2022/1/histogram/histogram_statement.pdf)」

题目描述

有一个由 $N$ 个底边平行于地面的矩形连续排列而成的直方图。每个矩形的宽度都是 $1$,并且从左到右第 $i (1 \leq i \leq N)$ 个矩形的高度为整数 $H_{i}$。 下图展示了一个可能的直方图示例。 ![](https://cdn.luogu.com.cn/upload/image_hosting/hoexztgq.png) 在这个直方图中,我们希望找到不超过 $K$ 个矩形,这些矩形的底边平行于地面,且除了顶点和边之外的区域不重叠,并且每个边的长度都是整数,使得这些矩形的面积之和最大。这个值记为 $f(K)$。 请编写一个程序来计算 $f(1), f(2), f(3)$。 你需要实现以下函数: `vector max_area(vector H);` - 该函数只会被调用一次。 - 参数中给定的整数数组 $\texttt{H}$ 的大小为 $N$。数组的每个元素 $\texttt{H[i]} (0 \leq i \leq N-1)$ 表示从左到右第 $i+1$ 个矩形的高度 $H_{i+1}$。 - 该函数返回一个大小为 $1 \sim 3$ 的数组 $\texttt{A}$。$\texttt{A[i]} (0 \leq i

输入格式

示例评测程序按以下格式读取输入: - 第 $1$ 行:$N$ - 第 $2$ 行:$H_{1}\,H_{2}\,\cdots H_{N}$

输出格式

示例评测程序按以下格式输出: - 第 $1+i (0 \leq i

说明/提示

### 评分标准 假设 `max_area` 函数返回的数组为 $\texttt{A}$。 如果 $\texttt{A}$ 的大小不是 $1$ 到 $3$ 之间,则得 $0$ 分。 根据子任务的标准,如果 $f(1), \cdots, f(|\texttt{A}|)$ 中有任何一个值不正确,则得 $0$ 分。 如果 $f(1), \cdots, f(|\texttt{A}|)$ 的值都正确,则根据子任务的评分标准得分。 在上述标准中,$f(i)$ 正确意味着 $\texttt{A}$ 的大小至少为 $i$ 并且 $\texttt{A}[i-1]$ 的值等于 $f(i)$。 每个子任务的分数是子任务所有数据的最小分数。 ### 样例解释 #1 考虑 $N=7, H=[3,2,1,2,1,4,3]$ 的情况。 评测程序将调用如下函数: `max_area([3,2,1,2,1,4,3])=[7,11,13]` 下图展示了对于 $K=1,2,3$ 时面积之和最大的情况之一。 ![](https://cdn.luogu.com.cn/upload/image_hosting/2t8kpz59.png) 如果 `max_area` 函数返回 $[7, 11]$,则 $f(1)$ 和 $f(2)$ 都正确,可以根据子任务的评分标准得分。如果 `max_area` 函数返回 $[7, 12, 13]$,则尽管 $f(1)$ 和 $f(3)$ 正确,但 $f(2)$ 错误,因此得 $0$ 分。如果 `max_area` 函数返回 $[7, 11, 14]$,则尽管 $f(1)$ 和 $f(2)$ 正确,但 $f(3)$ 错误,因此得 $0$ 分。 这个样例满足子任务 $2,3,4,5$ 的条件。 ### 样例解释 #2 考虑 $N=7, H=[1,2,3,4,5,6,7]$ 的情况。 评测程序将调用如下函数: `max_area([1,2,3,4,5,6,7])=[16,21,24]` 这个样例满足所有子任务的条件。 ### 样例解释 #3 考虑 $N=5, H=[1,3,4,3,1]$ 的情况。 评测程序将调用如下函数: `max_area([1,3,4,3,1])=[9,11,12]` 这个样例满足子任务 $2,3,4,5$ 的条件。 ### 数据范围 对于所有输入数据,满足: - $1 \leq N \leq 5\cdot 10^5$ - $1 \leq H_{i} \leq 5\cdot 10^5 (1 \leq i \leq N)$ 详细子任务附加限制及分值如下表所示。 |子任务|分值|约束| | :----------: | :----------: | :----------: | |$1$|$10$|$H_{i} \leq H_{i+1} (1 \leq i \leq N-1)$| |$2$|$3$|$N \leq 500$| |$3$|$15$|$N \leq 5000$| |$4$|$27$|$N \leq 2\cdot 10^5$| |$5$|$45$|无附加限制|