NOI Trung Quốc 2026 - Median

Xem PDF



Dạng bài
Ngôn ngữ cho phép
C++
Điểm: 2600 (p) Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Với một đa tập \(S=\{x_0,x_1,\ldots,x_{m-1}\}\), sắp xếp các phần tử theo thứ tự không tăng:

\[ y_0\ge y_1\ge\cdots\ge y_{m-1}. \]

Trong bài này, trung vị được định nghĩa là phần tử lớn thứ \(\lceil m/2\rceil\):

\[ \operatorname{Median}(S)=y_{\lceil m/2\rceil-1}. \]

Lưu ý rằng với số phần tử chẵn, định nghĩa này có thể khác định nghĩa trung vị thường gặp.

Cho dãy \([a_0,a_1,\ldots,a_{n-1}]\) và số nguyên dương \(k\le n\). Chọn

\[ 0<b_1<b_2<\cdots<b_{k-1}<n \]

để chia dãy thành đúng \(k\) đoạn không rỗng \([0,b_1),[b_1,b_2),\ldots,[b_{k-1},n)\). Đặt \(b_0=0,b_k=n\)

\[ c_i=\operatorname{Median}(\{a_{b_i},a_{b_i+1},\ldots,a_{b_{i+1}-1}\}). \]

Độ cân bằng của phép chia là \(\operatorname{Median}(\{c_0,c_1,\ldots,c_{k-1}\})\). Hãy tìm độ cân bằng lớn nhất trong mọi cách chia.

Yêu cầu cài đặt

Bạn không được cài đặt hàm main. Submission phải include median.h và cài đặt:

C++
void init(int c, int t);
  • c là số hiệu test; c=0 biểu thị dữ liệu mẫu.
  • t là số bộ dữ liệu trong test.
  • Bộ chấm gọi hàm đúng một lần khi chương trình bắt đầu.
C++
int median(int n, int k, std::vector<int> a);
  • Các tham số lần lượt là độ dài dãy, số đoạn và dãy đã cho.
  • Hàm phải trả về độ cân bằng lớn nhất.
  • Bộ chấm gọi hàm đúng t lần.

Khung khai báo:

C++
#include "median.h"

Dữ liệu bộ chấm

  • Dòng đầu chứa \(c,t\).
  • Với mỗi trong \(t\) bộ dữ liệu:
  • Dòng đầu chứa \(n,k\).
  • Dòng tiếp theo chứa \(a_0,a_1,\ldots,a_{n-1}\).

Grader ghi một dòng đáp án cho mỗi bộ dữ liệu.

Ràng buộc

Gọi \(N\) là tổng các giá trị \(n\) trong một test.

  • \(1\le t\le20\).
  • \(5\le n\le10^6\).
  • \(2\le k\le n\).
  • \(N\le10^6\).
  • \(1\le a_i\le n\).

Phân nhóm

Mỗi test có giá trị \(5\) điểm.

Test \(N\le\) \(n\le\) Điều kiện về \(k\) Tính chất
\(1,2\) \(40\) \(20\) \(k\le n\) Không
\(3\sim5\) \(800\) \(80\) \(k\le n\) A
\(6\) \(800\) \(80\) \(k\le n\) Không
\(7,8\) \(8000\) \(800\) \(k\le n\) A
\(9\) \(8000\) \(800\) \(k\le n\) Không
\(10\) \(2\cdot10^5\) \(2\cdot10^5\) \(k=2\) Không
\(11\) \(2\cdot10^5\) \(2\cdot10^5\) \(k=3\) Không
\(12,13\) \(2\cdot10^5\) \(2\cdot10^5\) \(k=5\) Không
\(14\) \(2\cdot10^5\) \(2\cdot10^5\) \(k\le10\) Không
\(15\) \(10^6\) \(10^6\) \(k\equiv0\pmod 2\) Không
\(16,17\) \(10^6\) \(10^6\) \(k>5\) Không
\(18\sim20\) \(10^6\) \(10^6\) \(k\le n\) Không

Tính chất A: \(a_i\le2\) với mọi \(0\le i<n\).

Ví dụ

Ví dụ

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

Trong bộ đầu, có thể chia thành \([6,5,1]\), \([9,2]\), \([3,10]\), \([7,4,8]\). Trung vị các đoạn là \(5,9,10,7\), nên độ cân bằng là \(9\).

Trong bộ thứ hai, có thể chia thành \([5,7]\), \([3,10]\), \([8,2]\), \([9,1]\), \([6,4]\). Trung vị các đoạn là \(7,10,8,9,6\), nên độ cân bằng là \(8\).

Nguồn

CCF NOI 2026 - Ngày 2, bài Median. Đề và dữ liệu chính thức được phát hành theo giấy phép CC BY-NC.

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: