P11235 [KTSC 2024 R1] 最大化平均值
题目背景
**请勿用 C++14 (GCC 9) 提交本题**
你需要在程序开头加入如下代码:
```cpp
#include
#include
void initialize(std::vector A);
std::array maximum_average(int i, int j);
```
题目保证时限在标程的十倍以上,交互库代码运行很快。
题目描述
**题目译自 [2024년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사](https://www.ioikorea.kr/archives/ioitst/2024/) T1 「[평균 최대화](https://assets.ioikorea.kr/ioitst/2024/1/average/average_statement.pdf)」**
给定一个由正整数组成的长度为 $m$ $(m \geq 2)$ 的序列 $x[0], \cdots, x[m-1]$,如果该序列满足以下条件,则称其为**封闭序列**:
- 对于所有 $k$ $(1 \leq k \leq m-2)$,$x[k] > x[0]$ 且 $x[k] > x[m-1]$。
也就是说,如果序列 $x$ 的两端元素都小于中间的所有元素,那么 $x$ 就是一个封闭序列。例如,$[3,7,8,4,2]$ 和 $[7,7]$ 是封闭序列,但 $[5,8,4,6,7]$ 和 $[3,3,4]$ 不是封闭序列。注意,长度为 $2$ 的所有序列都是封闭序列,而长度小于等于 $1$ 的序列不是封闭序列。
给定一个长度为 $K$ 的序列 $X[0], \cdots, X[K-1]$,定义**剔除操作**为选择一个封闭序列 $X[i], \cdots, X[j]$,并从序列中移除 $X[i+1], \cdots, X[j-1]$(即将序列变为 $X[0], \cdots, X[i], X[j], \cdots, X[K-1]$)。定义 $f(X)$ 为通过任意次数的剔除操作(可以不使用,也可以多次使用)得到的最终序列的最大平均值。
例如,$f([1,3,2,100,97,98,2,3,4,1])=43$,可以通过以下剔除操作实现:
- 选择 $i=0, j=2$,将序列变为 $[1,2,100,97,98,2,3,4,1]$。
- 选择 $i=5, j=8$,将序列变为 $[1,2,100,97,98,2,1]$。
- 最终序列为 $[1,2,100,97,98,2,1]$,其平均值为 $(1+2+100+97+98+2+1) / 7=43$。
给定一个由正整数组成的长度为 $N$ 的序列 $A[0], \cdots, A[N-1]$。对于每个给定的封闭序列 $(i, j)$,你需要计算 $f(A[i], \cdots, A[j])$ 的值。
你需要实现以下函数:
```cpp
void initialize(std::vector A);
```
- 该函数只会被调用一次,并且在其他所有函数调用之前调用。
- `A`:大小为 $N$ 的整数数组。
- 如果需要进行预处理或设置全局变量,可以在此函数中实现。
```cpp
std::array maximum_average(int i, int j);
```
- $0 \leq i < j \leq N-1$,且 $A[i], \cdots, A[j]$ 是一个封闭序列。
- 该函数应返回 $f(A[i], \cdots, A[j])=s / t$,其中 $[s, t]$ 是一个数组。
- $s$ 和 $t$ 是 $1$ 到 $10^{18}$ 之间的整数。可以证明,对于所有满足约束条件的输入,答案总能表示为这种形式的分数。
- 该函数会被调用 $Q$ 次。
输入格式
示例评测程序按以下格式读取输入:
- 第 $1$ 行:$N$
- 第 $2$ 行:$A[0]\,A[1]\,\cdots \,A[N-1]$
- 第 $3$ 行:$Q$
- 第 $3+k$ $(1 \leq k \leq Q)$ 行:$i[k]\,j[k]$(第 $k$ 次调用 `maximum_average` 函数的参数)
输出格式
示例评测程序输出:
- 第 $k$ 行:第 $k$ 次调用 `maximum_average` 返回的数组中的两个整数
说明/提示
对于所有输入数据,满足:
- $2 \leq N \leq 3\cdot 10^5$
- $1 \leq Q \leq 6\cdot 10^5$
- 对于所有 $i$ $(0 \leq i \leq N-1)$,$1 \leq A[i] \leq 10^7$
- 对于所有 `maximum_average` 调用,$0 \leq i < j \leq N-1$,且 $A[i], \cdots, A[j]$ 是一个封闭序列。
详细子任务附加限制及分值如下表所示。
| 子任务 | 分值 | 附加限制 |
| :-: | :-: | :-: |
| $1$ | $5$ | $N \leq 15$ |
| $2$ | $6$ | $N \leq 50$ |
| $3$ | $13$ | $N \leq 250$ |
| $4$ | $7$ | 对于所有 $i$ $(0 \leq i \leq N-1)$,$A[i] \leq 4$ |
| $5$ | $12$ | $N \leq 5000$ |
| $6$ | $17$ | $A$ 是一个封闭序列;$Q=1$,且调用 `maximum_average(0, N-1)`,即只需计算整个序列 $A$ 的答案 |
| $7$ | $8$ | 对于所有 $i$ $(0 \leq i \leq N-1)$,$A[i] \leq 20$ |
| $8$ | $32$ | 无附加限制 |