NOI Trung Quốc 2026 - Kapok

Xem PDF



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

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:

  • Cây có \(k=r-l+2\) đỉnh, đánh số từ \(0\) đến \(k-1\).
  • Dãy
\[ [\min(a_l,k-1),\min(a_{l+1},k-1),\ldots,\min(a_{r-1},k-1)] \]

là mã Prüfer của cây.

\(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?

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

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

C++
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.
  • Hàm phải trả về một vector có đúng \(m\) phần tử. Phần tử thứ \(i\)true khi \(x_i,y_i\) kề nhau và false trong trường hợp còn lại.
  • Bộ chấm gọi hàm đúng một lần cho mỗi test.

Khung khai báo:

C++
#include "kapok.h"

Dữ liệu bộ chấm

  • Dòng đầu chứa \(c,n,m\).
  • Dòng thứ hai chứa \(a_0,a_1,\ldots,a_{n-1}\).
  • Mỗi trong \(m\) dòng tiếp theo chứa \(l_i,r_i,x_i,y_i\).

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.

Ràng buộc

  • \(1\le n,m\le2\cdot10^5\).
  • \(0\le a_i<n+2\).
  • \(0\le l_i\le r_i\le n\).
  • \(0\le x_i,y_i<r_i-l_i+2\).

Phân nhóm

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.

Nhắc lại về mã Prüfer

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:

  1. Chọn lá có nhãn nhỏ nhất \(v_i\) trong cây hiện tại.
  2. Ghi lại nhãn \(p_i\) của đỉnh kề duy nhất với \(v_i\).
  3. Xóa \(v_i\) và cạnh duy nhất nối với nó.

Dãy \([p_0,p_1,\ldots,p_{c-3}]\) thu được là mã Prüfer của \(T\).

Ví dụ

Ví dụ

Input
0 8 3
2 0 2 6 0 7 2 2
0 3 0 2
3 5 1 2
0 0 0 1
Output
1
0
1
  • Đoạn \([0,3)\) cho mã Prüfer \([2,0,2]\) của cây có các cạnh \((1,2),(0,3),(0,2),(2,4)\), nên \(0,2\) kề nhau.
  • Đoạn \([3,5)\) cho mã \([3,0]\) của cây có các cạnh \((1,3),(0,2),(0,3)\), nên \(1,2\) không kề nhau.
  • Đoạn \([0,0)\) cho cây hai đỉnh với cạnh duy nhất \((0,1)\).

Nguồn

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.

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: