luogu#P11235. 「KTSC 2024 R1」最大化平均值(spj 暂缺)

    ID: 35119 远端评测题 5000ms 1000MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>2024交互题Special JudgeKOI(韩国)

「KTSC 2024 R1」最大化平均值(spj 暂缺)

题目背景

请勿用 C++14 (GCC 9) 提交本题

你需要在程序开头加入如下代码:

#include<vector>
#include<array>
void initialize(std::vector<int> A);
std::array<long long, 2> maximum_average(int i, int j);

题目描述

题目译自 2024년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사 T1 「평균 최대화

给定一个由正整数组成的长度为 mm (m2)(m \geq 2) 的序列 x[0],,x[m1]x[0], \cdots, x[m-1],如果该序列满足以下条件,则称其为封闭序列

  • 对于所有 kk (1km2)(1 \leq k \leq m-2)x[k]>x[0]x[k] > x[0]x[k]>x[m1]x[k] > x[m-1]

也就是说,如果序列 xx 的两端元素都小于中间的所有元素,那么 xx 就是一个封闭序列。例如,[3,7,8,4,2][3,7,8,4,2][7,7][7,7] 是封闭序列,但 [5,8,4,6,7][5,8,4,6,7][3,3,4][3,3,4] 不是封闭序列。注意,长度为 22 的所有序列都是封闭序列,而长度小于等于 11 的序列不是封闭序列。

给定一个长度为 KK 的序列 X[0],,X[K1]X[0], \cdots, X[K-1],定义剔除操作为选择一个封闭序列 X[i],,X[j]X[i], \cdots, X[j],并从序列中移除 X[i+1],,X[j1]X[i+1], \cdots, X[j-1](即将序列变为 X[0],,X[i],X[j],,X[K1]X[0], \cdots, X[i], X[j], \cdots, X[K-1])。定义 f(X)f(X) 为通过任意次数的剔除操作(可以不使用,也可以多次使用)得到的最终序列的最大平均值。

例如,f([1,3,2,100,97,98,2,3,4,1])=43f([1,3,2,100,97,98,2,3,4,1])=43,可以通过以下剔除操作实现:

  • 选择 i=0,j=2i=0, j=2,将序列变为 [1,2,100,97,98,2,3,4,1][1,2,100,97,98,2,3,4,1]
  • 选择 i=5,j=8i=5, j=8,将序列变为 [1,2,100,97,98,2,1][1,2,100,97,98,2,1]
  • 最终序列为 [1,2,100,97,98,2,1][1,2,100,97,98,2,1],其平均值为 (1+2+100+97+98+2+1)/7=43(1+2+100+97+98+2+1) / 7=43

给定一个由正整数组成的长度为 NN 的序列 A[0],,A[N1]A[0], \cdots, A[N-1]。对于每个给定的封闭序列 (i,j)(i, j),你需要计算 f(A[i],,A[j])f(A[i], \cdots, A[j]) 的值。

你需要实现以下函数:

void initialize(std::vector<int> A);
  • 该函数只会被调用一次,并且在其他所有函数调用之前调用。
  • A:大小为 NN 的整数数组。
  • 如果需要进行预处理或设置全局变量,可以在此函数中实现。
std::array<long long, 2> maximum_average(int i, int j);
  • 0i<jN10 \leq i < j \leq N-1,且 A[i],,A[j]A[i], \cdots, A[j] 是一个封闭序列。
  • 该函数应返回 f(A[i],,A[j])=s/tf(A[i], \cdots, A[j])=s / t,其中 [s,t][s, t] 是一个数组。
  • sstt11101810^{18} 之间的整数。可以证明,对于所有满足约束条件的输入,答案总能表示为这种形式的分数。
  • 该函数会被调用 QQ 次。

输入格式

示例评测程序按以下格式读取输入:

  • 11 行:NN
  • 22 行:A[0]A[1]A[N1]A[0]\,A[1]\,\cdots \,A[N-1]
  • 33 行:QQ
  • 3+k3+k (1kQ)(1 \leq k \leq Q) 行:i[k]j[k]i[k]\,j[k](第 kk 次调用 maximum_average 函数的参数)

输出格式

示例评测程序输出:

  • kk 行:第 kk 次调用 maximum_average 返回的数组中的两个整数
10
2 4 3 9 9 9 9 9 9 1
2
0 2
0 9
3 1
20 3

提示

对于所有输入数据,满足:

  • 2N31052 \leq N \leq 3\cdot 10^5
  • 1Q61051 \leq Q \leq 6\cdot 10^5
  • 对于所有 ii (0iN1)(0 \leq i \leq N-1)1A[i]1071 \leq A[i] \leq 10^7
  • 对于所有 maximum_average 调用,0i<jN10 \leq i < j \leq N-1,且 A[i],,A[j]A[i], \cdots, A[j] 是一个封闭序列。

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 55 N15N \leq 15
22 66 N50N \leq 50
33 1313 N250N \leq 250
44 77 对于所有 ii (0iN1)(0 \leq i \leq N-1)A[i]4A[i] \leq 4
55 1212 N5000N \leq 5000
66 1717 AA 是一个封闭序列;Q=1Q=1,且调用 maximum_average(0, N-1),即只需计算整个序列 AA 的答案
77 88 对于所有 ii (0iN1)(0 \leq i \leq N-1)A[i]20A[i] \leq 20
88 3232 无附加限制