QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 1024 MB Total points: 100 Difficulty: [show] Hackable ✓

#18986. 中位數

Statistics

對於大小為 $m$ 的多重集合 $S=\{x_0,x_1,\ldots,x_{m-1}\}$,設其所有元素從大到小排序後的結果為 $y_0\ge y_1\ge\cdots\ge y_{m-1}$。定義其中位數 $\operatorname{Median}(S)$ 為其中第 $\lceil m/2\rceil$ 大的數,即 $\operatorname{Median}(S)=y_{\lceil m/2\rceil-1}$。注意:本題中的中位數定義與常規定義可能有所不同。

給定長度為 $n$ 的序列 $[a_0,a_1,\ldots,a_{n-1}]$,以及一個正整數 $k$($k\le n$)。定義一個劃分如下:選擇一個長度為 $k-1$ 的遞增下標序列 $0<b_1<\cdots<b_{k-1}<n$,即可將原序列劃分為 $k$ 個段,對應的下標區間依次為 $[0,b_1),[b_1,b_2),\ldots,[b_{k-1},n)$。

對於一個劃分,定義該劃分的平衡度如下:對於劃分出的每個段,計算其中所有元素形成的多重集合的中位數,則這 $k$ 個中位數形成的多重集合的中位數即為該劃分的平衡度。形式化地,對於劃分 $b_1,\ldots,b_{k-1}$,記 $b_0=0$,$b_k=n$,設第 $i$($0\le i<k$)個段中所有元素形成的多重集合的中位數為 $c_i=\operatorname{Median}(\{a_{b_i},a_{b_i+1},\ldots,a_{b_{i+1}-1}\})$,則該劃分的平衡度為 $\operatorname{Median}(\{c_0,\ldots,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$ 分別表示序列長度、劃分的段數與給定的序列。
  • 該函式需要回傳平衡度的最大值。
  • 對於每個測試點,該函式會被評測程式呼叫恰好 $t$ 次。

本試題目錄下的 template_median.cpp 是提供的範例程式碼,選手可參考並實作自己的程式碼。

測試程式方式

選手可以在本題目錄下使用如下命令編譯得到可執行檔:

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

對於編譯得到的可執行檔 median:

  • 可執行檔將從標準輸入讀入以下格式的資料:

第一行包含兩個非負整數 $c,t$。

接下來依次為每組測試資料,對於每組測試資料:

  • 第一行包含兩個正整數 $n,k$。
  • 第二行包含 $n$ 個正整數 $a_0,a_1,\ldots,a_{n-1}$。

可執行檔將輸出以下格式的資料至標準輸出:

  • 對於每組測試資料,輸出一行一個正整數,表示平衡度的最大值。

範例

輸入格式 1

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

輸出格式 1

9
8

說明

對於第一組測試資料,一種平衡度最大的劃分為 $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$。

範例 2

見選手目錄下的 median/median2.in 與 median/median2.ans。

該範例滿足測試點 $6$ 的約束條件。

範例 3

見選手目錄下的 median/median3.in 與 median/median3.ans。

該範例滿足測試點 $9$ 的約束條件。

範例 4

見選手目錄下的 median/median4.in 與 median/median4.ans。

該範例滿足測試點 $14$ 的約束條件。

範例 5

見選手目錄下的 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$ $800$ $80$ $\le n$ 無
$7,8$ $8000$ $800$ $\le n$ A
$9$ $8000$ $800$ $\le n$ 無
$10$ $2\times 10^5$ $2\times 10^5$ $=2$ 無
$11$ $2\times 10^5$ $2\times 10^5$ $=3$ 無
$12,13$ $2\times 10^5$ $2\times 10^5$ $=5$ 無
$14$ $2\times 10^5$ $2\times 10^5$ $\le 10$ 無
$15$ $2\times 10^5$ $2\times 10^5$ $\equiv 0\pmod 2$ 無
$16,17$ $10^6$ $10^6$ $>5$ 無
$18\sim 20$ $10^6$ $10^6$ $\le n$ 無

特殊性質 A:對於所有 $0\le i<n$,均有 $a_i\le 2$。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.