| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | EJOI 2026 - Increasing Split | 100 (p) | 1.5s | 1G |
| 2 | EJOI 2026 - Reconstruct | 100 (p) | 4.0s | 1G |
| 3 | EJOI 2026 - XORting | 100 (p) | 2.0s | 1G |
Boris và Ihor nhận một dãy \(a_0,a_1,\ldots,a_{N-1}\) gồm các số nguyên dương. Bạn biết toàn bộ dãy, sau đó xét các phần tử từ trái sang phải và phải giao mỗi phần tử cho đúng một trong hai người.
Theo thứ tự nhận, dãy của mỗi người phải tăng nghiêm ngặt. Phần tử đầu tiên của một người có thể có giá trị bất kỳ và một người có thể không nhận phần tử nào.
Với mỗi \(K\) từ \(0\) đến \(N\), hãy xác định độc lập xem có thể chia dãy sao cho Boris nhận đúng \(K\) phần tử hay không.
Submission C++ phải include increasing.h và cài đặt:
std::vector<bool> increasing_split(std::vector<int> a);
Hàm được gọi đúng một lần. Nó phải trả về vector có đúng \(N+1\) phần tử; phần tử thứ \(K\) là true khi cách chia tương ứng tồn tại.
Submission không đọc standard input. Sample grader đọc \(N\) rồi dãy \(a\).
Submission không ghi standard output. Kết quả được trả qua increasing_split.
Ví dụ 1
5
3 1 4 5 5
001100
Ví dụ 2
4
1 2 3 4
11111
EJOI 2026 - Ngày 1, Increasing Split.
Đề bài EJOI 2026 được phát hành theo giấy phép Creative Commons Attribution (CC BY).
Có \(N\) địa điểm và một cây giao thông bí mật gồm \(N-1\) cạnh. Với mỗi đỉnh bắt đầu \(i\), ban giám khảo cố định một thứ tự duyệt DFS của toàn bộ cây, bắt đầu tại \(i\). Thứ tự xét các đỉnh kề có thể khác giữa các lần DFS.
Hình 1: Một lượt DFS bắt đầu ở đỉnh \(4\); các mũi tên được đánh số theo thứ tự di chuyển.
Bạn được hỏi phần tử thứ \(j\) trong thứ tự DFS bắt đầu tại \(i\). Hãy khôi phục chính xác cây bí mật. Cây và mọi thứ tự DFS được cố định trước khi chương trình chạy.
Submission C++ phải include reconstruct.h và cài đặt:
std::vector<std::pair<int, int>> find_tree(int N);
Grader cung cấp:
int guess(int i, int j);
guess(i,j) trả về địa điểm thứ \(j\) trong thứ tự DFS bắt đầu tại \(i\); đặc biệt guess(i,0)=i. Mọi chỉ số phải thuộc \([0,N-1]\). find_tree phải trả đúng \(N-1\) cạnh, với hai đầu mút được đánh số từ \(0\) đến \(N-1\); thứ tự cạnh và thứ tự hai đầu mút không quan trọng. Hàm có thể được gọi \(T\) lần trong một test.
Đây là bài giao tiếp. Submission chạy trong một tiến trình riêng và chỉ được trao đổi với manager qua các hàm trên.
Submission không đọc standard input. Manager đọc các cây và thứ tự DFS ẩn từ bộ test.
Submission không ghi standard output. Kết quả được trả từ find_tree.
guess chạy trong \(O(1)\) ở các phân nhóm 1--6 và \(O(\log N)\) ở phân nhóm 7.Ở phân nhóm 6 và 7, gọi \(Q_{\max}\) là số truy vấn lớn nhất trong một lần gọi. Điểm theo tỉ lệ \(S\): \(S=1\) nếu \(Q_{\max}\le L_1\); \(S=0.4+0.6(L_2-Q_{\max})/(L_2-L_1)\) nếu \(L_1<Q_{\max}\le L_2\); \(S=0.2+0.2(3L_2-Q_{\max})/(2L_2)\) nếu \(L_2<Q_{\max}\le3L_2\); và \(S=0.2\) nếu \(Q_{\max}>3L_2\). Phân nhóm 6 dùng \((L_1,L_2)=(3075,9225)\); phân nhóm 7 dùng \((196611,983055)\). Điểm của phân nhóm là tỉ lệ nhỏ nhất trên mọi test.
Hình 2: Điểm của phân nhóm 6 theo số truy vấn lớn nhất.
Hình 3: Điểm của phân nhóm 7 theo số truy vấn lớn nhất.
Hình 4: Cây giao thông bí mật của ví dụ.
Với một cây có \(6\) đỉnh và thứ tự DFS từ đỉnh \(0\) là [0, 1, 2, 4, 3, 5], các lời gọi guess(0,j) lần lượt trả các phần tử trên. Một kết quả hợp lệ có thể gồm các cạnh (0,1), (0,2), (4,0), (5,4), (3,4).
EJOI 2026 - Ngày 1, Reconstruct.
Đề bài EJOI 2026 được phát hành theo giấy phép Creative Commons Attribution (CC BY).
Một hoán vị ẩn \(p_0,p_1,\ldots,p_{N-1}\) của \(0,\ldots,N-1\) được cố định trước khi chương trình chạy. Bạn có thể hỏi \(p_i\mathbin{\mathrm{XOR}}p_j\) cho hai chỉ số tùy ý.
Hai hoán vị \(a,p\) được gọi là không thể phân biệt nếu \(a_i\mathbin{\mathrm{XOR}}a_j=p_i\mathbin{\mathrm{XOR}}p_j\) với mọi cặp chỉ số. Hãy tìm hoán vị nhỏ nhất theo thứ tự từ điển trong lớp không thể phân biệt với \(p\). Hoán vị \(x\) nhỏ hơn hoán vị \(y\) theo thứ tự từ điển nếu tại vị trí đầu tiên mà chúng khác nhau, phần tử của \(x\) nhỏ hơn phần tử của \(y\).
Submission C++ phải include xorting.h và cài đặt:
std::vector<int> solve(int N);
Grader cung cấp:
int get_xor(int i, int j);
solve được gọi đúng \(T\) lần. Mỗi lần phải trả hoán vị nhỏ nhất theo thứ tự từ điển. get_xor(i,j) trả \(p_i\mathbin{\mathrm{XOR}}p_j\) trong \(O(1)\); cả hai chỉ số phải thuộc \([0,N-1]\). Giới hạn truy vấn \(Q_i\) của mỗi lần gọi không được truyền cho submission.
Submission không đọc standard input. Sample grader đọc \(T\), loại giới hạn truy vấn, rồi từng hoán vị ẩn.
Submission không ghi standard output. Kết quả được trả từ solve.
Nếu hoán vị ẩn là [2,0,1,3], sáu truy vấn giữa các cặp chỉ số cho phép trả về [0,2,3,1], là hoán vị nhỏ nhất không thể phân biệt. Với \(N=1\), kết quả duy nhất là [0].
Đề bài EJOI 2026 được phát hành theo giấy phép Creative Commons Attribution (CC BY).