UOJ Logo Universal Online Judge

UOJ

#1105. 【NOI2026】中位数

附件下载 统计

对于大小为 $m$ 的可重集 $S = {x_0,x_1,\dots,x_{m - 1}}$,设其所有元素从大到小排序后的结果为 $y_0 \ge y_1 \ge \dots \ge y_{m - 1}$。定义其中位数 $\operatorname{Median}(S)$ 为其中第 $\left\lceil \frac{m}{2} \right\rceil$ 大的数,即 $\operatorname{Median}(S) = y_{\left\lceil \frac{m}{2} \right\rceil - 1}$。

注意:本题中的中位数定义与常规定义可能有所不同。

给定一个长度为 $n$ 的序列 $[a_0,a_1,\dots,a_{n - 1}]$,以及一个正整数 $k\ (k \le n)$。

定义一个划分如下:选择一个长度为 $k - 1$ 的递增下标序列 $0 < b_1 < \dots < b_{k - 1} < n$,将原序列划分为 $k$ 个非空段,对应的下标区间依次为

$[0,b_1),[b_1,b_2),\dots,[b_{k - 1},n)$。

对于一个划分,定义其平衡度如下:计算每个段中所有元素组成的可重集的中位数,再计算这 $k$ 个中位数组成的可重集的中位数。最终得到的数即为该划分的平衡度。

形式化地,对于划分 $b_1,b_2,\dots,b_{k - 1}$,令 $b_0 = 0$,$b_k = n$。对于每个 $0 \le i < k$,令

$c_i = \operatorname{Median}({a_{b_i},a_{b_i + 1},\dots,a_{b_{i + 1} - 1}})$,

则该划分的平衡度为 $\operatorname{Median}({c_0,c_1,\dots,c_{k - 1}})$。

请计算所有划分中平衡度的最大值。

实现细节

选手不需要,也不应该实现 main 函数。

选手需要确保提交的程序源文件包含头文件 median.h,即在程序开头加入以下代码:

#include "median.h"

选手需要在提交的程序源文件 median.cpp 中实现以下两个函数:

void init(int c, int t);
  • $c,t$ 分别表示测试点编号与测试数据组数。$c = 0$ 表示该测试点为样例。
  • 对于每个测试点,该函数会在程序开始运行时被评测程序调用恰好一次。
int median(int n, int k, std::vector < int > a);
  • $n,k$ 分别表示序列长度与需要划分出的段数。
  • $a$ 是一个长度为 $n$ 的序列,表示给定的序列。
  • 该函数需要返回所有划分中平衡度的最大值。
  • 对于每个测试点,该函数会被评测程序调用恰好 $t$ 次。

本试题目录下的 template_median.cpp 是提供的示例代码,选手可参考并实现自己的代码。

测试程序方式

选手可以在本题目录下使用如下命令编译得到可执行文件:

g++ grader.cpp median.cpp -o median -O2 -std=c++14 -static

对于编译得到的可执行文件 median:

  • 可执行文件将从标准输入读入以下格式的数据:

    • 第一行包含两个非负整数 $c,t$。
    • 接下来依次输入 $t$ 组测试数据。对于每组测试数据:

      • 第一行包含两个正整数 $n,k$。
      • 第二行包含 $n$ 个正整数 $a_0,a_1,\dots,a_{n - 1}$。
  • 可执行文件将输出以下格式的数据至标准输出:

    • 对于每组测试数据,输出一行一个正整数,表示所有划分中平衡度的最大值。

样例一

input

0 2
10 4
6 5 1 9 2 3 10 7 4 8
10 5
5 7 3 10 8 2 9 1 6 4

output

9
8

explanation

对于第一组测试数据,一种平衡度最大的划分为 $b_1 = 3$,$b_2 = 5$,$b_3 = 7$。

该划分将原序列划分为以下 $4$ 个段:

  • $[6,5,1]$;
  • $[9,2]$;
  • $[3,10]$;
  • $[7,4,8]$。

各段中所有元素的中位数依次为 $5,9,10,7$,因此该划分的平衡度为 $\operatorname{Median}({5,9,10,7}) = 9$。

对于第二组测试数据,一种平衡度最大的划分为 $b_1 = 2$,$b_2 = 4$,$b_3 = 6$,$b_4 = 8$。

该划分将原序列划分为以下 $5$ 个段:

  • $[5,7]$;
  • $[3,10]$;
  • $[8,2]$;
  • $[9,1]$;
  • $[6,4]$。

各段中所有元素的中位数依次为 $7,10,8,9,6$,因此该划分的平衡度为 $\operatorname{Median}({7,10,8,9,6}) = 8$。

样例二

见下发文件 median/median2.in 与 median/median2.ans。

该样例满足测试点 $6$ 的约束条件。

样例三

见下发文件 median/median3.in 与 median/median3.ans。

该样例满足测试点 $9$ 的约束条件。

样例四

见下发文件 median/median4.in 与 median/median4.ans。

该样例满足测试点 $14$ 的约束条件。

样例五

见下发文件 median/median5.in 与 median/median5.ans。

该样例满足测试点 $18 \sim 20$ 的约束条件。

数据范围

设 $N$ 为单个测试点内所有测试数据的 $n$ 之和。

对于所有测试数据,均有:

  • $1 \le t \le 20$;
  • $5 \le n \le 10^6$;
  • $2 \le k \le n$;
  • $N \le 10^6$;
  • 对于所有 $0 \le i < n$,均有 $1 \le a_i \le n$。
测试点编号 $N \le$ $n \le$ $k$ 特殊性质
$1,2$ $40$ $20$ $\le n$ 无
$3 \sim 5$ $800$ $80$ $\le n$ A
$6$ 无
$7,8$ $8000$ $800$ $\le n$ A
$9$ 无
$10$ $2 \times 10^5$ $2 \times 10^5$ $= 2$ 无
$11$ $= 3$
$12,13$ $= 5$
$14$ $\le 10$
$15$ $\equiv 0 \pmod 2$
$16,17$ $10^6$ $10^6$ $> 5$
$18 \sim 20$ $\le n$

特殊性质 A:对于所有 $0 \le i < n$,均有 $a_i \le 2$。

时间限制:$\texttt{1s}$

空间限制:$\texttt{1GB}$