| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | NOI Trung Quốc 2026 - Median | 100 (p) | 1.0s | 1G |
| 2 | NOI Trung Quốc 2026 - Kapok | 100 (p) | 2.0s | 1G |
| 3 | NOI Trung Quốc 2026 - Rainbow Tree | 100 (p) | 1.0s | 1G |
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:
Trong bài này, trung vị được định nghĩa là phần tử lớn thứ \(\lceil m/2\rceil\):
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
để 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\) và
Độ 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.
Bạn không được cài đặt hàm main. Submission phải include median.h và cài đặt:
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.int median(int n, int k, std::vector<int> a);
t lần.Khung khai báo:
#include "median.h"
Grader ghi một dòng đáp án cho mỗi bộ dữ liệu.
Gọi \(N\) là tổng các giá trị \(n\) trong một test.
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ụ
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
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\).
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.
Ký ức của N được biểu diễn bằng một dãy \([a_0,a_1,\ldots,a_{n-1}]\).
Mỗi cây gạo trong ký ức là một cây vô hướng có nhãn. Một đoạn nửa kín \([l,r)\) của dãy mô tả một cây như sau:
là mã Prüfer của cây.
Có \(m\) truy vấn. Truy vấn thứ \(i\) hỏi: trong cây được mô tả bởi đoạn \([l_i,r_i)\), hai đỉnh \(x_i,y_i\) có kề nhau hay không?
Bạn không được cài đặt hàm main. Submission phải include kapok.h và cài đặt:
std::vector<bool> kapok(
int c, int n, int m,
std::vector<int> a,
std::vector<int> l,
std::vector<int> r,
std::vector<int> x,
std::vector<int> y
);
c là số hiệu test; c=0 biểu thị dữ liệu mẫu.n, m là độ dài dãy và số truy vấn.a là dãy ký ức.l, r là hai đầu đoạn của từng truy vấn.x, y là hai đỉnh được hỏi trong từng truy vấn.true khi \(x_i,y_i\) kề nhau và false trong trường hợp còn lại.Khung khai báo:
#include "kapok.h"
Grader ghi \(m\) dòng, mỗi dòng là 1 nếu câu trả lời là true, ngược lại là 0.
Mỗi test có giá trị \(4\) điểm.
| Test | \(n,m\le\) | Tính chất |
|---|---|---|
| \(1,2\) | \(500\) | Không |
| \(3\sim5\) | \(5000\) | Không |
| \(6,7\) | \(2\cdot10^5\) | \(a_i<10\) với mọi \(i\) |
| \(8,9\) | \(2\cdot10^5\) | \(a_i<10^3\) với mọi \(i\) |
| \(10,11\) | \(2\cdot10^5\) | \(x_i,y_i<10\) với mọi truy vấn |
| \(12,13\) | \(2\cdot10^5\) | \(x_i,y_i<10^3\) với mọi truy vấn |
| \(14\sim16\) | \(2\cdot10^5\) | A |
| \(17\sim19\) | \(2\cdot10^5\) | \(r_i=n\) với mọi truy vấn |
| \(20\sim22\) | \(10^5\) | Không |
| \(23\sim25\) | \(2\cdot10^5\) | Không |
Tính chất A: sau khi đã cho \(l_i,r_i\), hai giá trị \(x_i,y_i\) được sinh độc lập và đều trên toàn bộ miền giá trị hợp lệ của chúng.
Với cây vô hướng \(T\) có các đỉnh \(0,1,\ldots,c-1\), \(c\ge2\), thực hiện \(c-2\) lần:
Dãy \([p_0,p_1,\ldots,p_{c-3}]\) thu được là mã Prüfer của \(T\).
Ví dụ
0 8 3
2 0 2 6 0 7 2 2
0 3 0 2
3 5 1 2
0 0 0 1
1
0
1
CCF NOI 2026 - Ngày 2, bài Kapok. Đề và dữ liệu chính thức được phát hành theo giấy phép CC BY-NC.
Có một cây có gốc gồm \(n\) đỉnh, đánh số từ \(0\) đến \(n-1\). Đỉnh \(0\) là gốc; với \(1\le i<n\), cha của đỉnh \(i\) là \(f_i\).
Mỗi đỉnh có thể mang một trong vô hạn màu. Với mỗi đỉnh \(i\), gọi \(c_i\) là số màu khác nhau xuất hiện trong cây con gốc \(i\). Độ rực rỡ của cây là dãy
Độ rực rỡ chỉ phụ thuộc vào số màu phân biệt trong các cây con, không phụ thuộc vào tên cụ thể của các màu.
Hình 1: Một cách tô màu có độ rực rỡ \([3,2,1,2,1,1]\); các đỉnh \(0,1,5\) cùng màu, các đỉnh \(2,4\) cùng màu và đỉnh \(3\) mang màu còn lại.
Một quy luật được mô tả bằng tập \(S\subseteq\{1,2,\ldots,n-1\}\). Một cách tô màu thỏa quy luật \(S\) khi với mọi \(u\in S\), tồn tại một tổ tiên thực sự \(p\) của \(u\) có cùng màu với \(u\).
Gọi \(w_S\) là số dãy độ rực rỡ khác nhau có thể thu được từ những cách tô màu thỏa quy luật \(S\). Hai độ rực rỡ khác nhau khi ít nhất một vị trí trong hai dãy khác nhau.
Hãy tính
theo modulo \(998\,244\,353\).
Bạn không được cài đặt hàm main. Submission phải include rainbow.h và cài đặt:
int rainbow(int c, int n, std::vector<int> f);
c là số hiệu test; c=0 biểu thị dữ liệu mẫu.n là số đỉnh.f có độ dài \(n\), với \(f_0=0\) và \(f_i\) là cha của \(i\) khi \(1\le i<n\).Khung khai báo:
#include "rainbow.h"
Grader ghi một số nguyên là giá trị trả về của rainbow.
Mỗi test có giá trị \(4\) điểm.
| Test | \(n\le\) | Tính chất |
|---|---|---|
| \(1\) | \(4\) | Không |
| \(2\) | \(8\) | Không |
| \(3,4\) | \(16\) | Không |
| \(5\sim7\) | \(50\) | Không |
| \(8,9\) | \(10^2\) | B |
| \(10\sim12\) | \(10^2\) | Không |
| \(13\sim15\) | \(150\) | Không |
| \(16\) | \(200\) | A |
| \(17\sim19\) | \(200\) | B |
| \(20\sim25\) | \(200\) | Không |
Ví dụ 1
0 3
0 0
8
Do đó đáp án là \(3+2+2+1=8\).
Ví dụ 2
0 6
0 1 0 3 1
279
CCF NOI 2026 - Ngày 2, bài Rainbow Tree. Đề và dữ liệu chính thức được phát hành theo giấy phép CC BY-NC.