| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | SEATST 2026 - Two Exams | 100 (p) | 3.0s | 512M |
| 2 | SEATST 2026 - Country Ranks | 100 (p) | 2.0s | 256M |
| 3 | SEATST 2026 - XOR Teleport | 100 (p) | 4.0s | 512M |
Có \(N\) học sinh trong một lớp. Mỗi học sinh được đánh số từ \(0\) đến \(N-1\) theo thứ hạng hiện tại trong lớp: học sinh \(i\) đang có hạng \(i\). Hạng \(0\) là tốt nhất và hạng \(N-1\) là thấp nhất.
Lớp vừa tổ chức hai kỳ thi Tiếng Anh và Toán. Học sinh \(i\) đạt hạng \(A[i]\) trong kỳ thi Tiếng Anh và hạng \(B[i]\) trong kỳ thi Toán. Cả \(A\) và \(B\) đều là các hoán vị độ dài \(N\).
Trong bài này, một hoán vị \(P\) độ dài \(N\) là một mảng thỏa mãn \(0\le P[i]\le N-1\) với mọi \(0\le i<N\), và \(P[i]\ne P[j]\) với mọi \(0\le i<j<N\). Chẳng hạn, \([2,1,0]\) là một hoán vị độ dài \(3\), còn \([1,2,3]\) và \([2,0,2]\) thì không.
Giáo viên muốn xếp hạng lại các học sinh. Thứ hạng mới được biểu diễn bởi một hoán vị \(P\). Với mỗi học sinh \(i\), thứ hạng mới phải thỏa mãn ít nhất một trong hai điều kiện sau:
Lưu ý rằng điều kiện chỉ áp dụng cho các học sinh \(j\) có \(P[j]<P[i]\); không có ràng buộc nào đối với các học sinh có \(P[j]\ge P[i]\). Khi kiểm tra điều kiện cho một học sinh \(i\), phải chọn một môn duy nhất rồi so sánh với tất cả các học sinh \(j\) tương ứng; không được đổi môn giữa các học sinh \(j\) khác nhau.
Mức độ bất mãn của thứ hạng mới là mức tụt hạng lớn nhất trong số tất cả học sinh, tức là
Các giá trị \(i-P[i]\) không ảnh hưởng đến mức độ bất mãn.
Hãy tìm mức độ bất mãn nhỏ nhất có thể của thứ hạng mới.
Bạn cần cài đặt hàm sau:
int minimum_dissatisfaction(int N, std::vector<int> A,
std::vector<int> B);
Bài nộp không được cài đặt hàm main và phải khai báo #include "exam.h".
| Phần | Điểm | Giới hạn thêm |
|---|---|---|
| 1 | 3 | \(N\le 8\) |
| 2 | 4 | \(N\le 20\) |
| 3 | 13 | \(N\le 500\) |
| 4 | 12 | \(N\le 3000\); \(A[i]+B[i]=N-1\) với mọi \(0\le i<N\) |
| 5 | 19 | \(N\le 3000\) |
| 6 | 15 | \(N\le 100\,000\); \(A[i]+B[i]=N-1\) với mọi \(0\le i<N\) |
| 7 | 17 | \(N\le 100\,000\) |
| 8 | 17 | Không có giới hạn thêm |
Trong phần 8, riêng trình chấm được đảm bảo sử dụng \(1500\) ms trong giới hạn thời gian \(3000\) ms.
Xét lời gọi:
minimum_dissatisfaction(5, [3, 0, 4, 1, 2], [0, 3, 2, 4, 1])
Một cách xếp hạng mới là \(P=[0,2,3,4,1]\).
Mức độ bất mãn của thứ hạng này là \(1\), và không tồn tại thứ hạng hợp lệ nào có mức độ bất mãn nhỏ hơn. Vì vậy hàm phải trả về 1.
Trình chấm mẫu đọc dữ liệu theo định dạng:
N
A[0] A[1] ... A[N - 1]
B[0] B[1] ... B[N - 1]
và in một số nguyên là giá trị trả về của minimum_dissatisfaction.
Nguồn: Southeast Asia Team Selection Test 2026, Ngày 1, bài Two Exams.
Có \(N\) học sinh tham dự SEATST. Mỗi học sinh đại diện cho đúng một quốc gia. Sau kỳ thi, tất cả học sinh đều có số điểm khác nhau.
Prabowo chuẩn bị đăng bảng xếp hạng lên trang web chính thức. Với mỗi học sinh, bảng xếp hạng ghi quốc gia, điểm số, thứ hạng toàn cuộc và thứ hạng trong quốc gia.
Ví dụ:
| Quốc gia | Điểm | Hạng toàn cuộc | Hạng trong quốc gia |
|---|---|---|---|
| Singapore | 574 | 0 | 0 |
| Malaysia | 483 | 1 | 0 |
| Singapore | 466 | 2 | 1 |
| Indonesia | 460 | 3 | 0 |
| Singapore | 458 | 4 | 2 |
| Malaysia | 454 | 5 | 1 |
| Singapore | 448 | 6 | 3 |
| Malaysia | 440 | 7 | 2 |
| Indonesia | 438 | 8 | 1 |
Cả hai loại thứ hạng đều bắt đầu từ \(0\) và không bỏ qua giá trị nào, dù xét toàn cuộc hay trong từng quốc gia.
Khi tải bảng xếp hạng lên mạng, Prabowo quên đăng quốc gia và điểm số. Với mỗi học sinh, ta chỉ biết thứ hạng toàn cuộc và thứ hạng trong quốc gia.
Bạn cần tính hai đại lượng:
Nếu có hai cách gán học sinh vào các quốc gia đều phù hợp với dữ liệu, trong đó một cặp học sinh cùng quốc gia ở cách thứ nhất nhưng khác quốc gia ở cách thứ hai, thì cặp đó không được tính vào đại lượng nào.
Bạn cần cài đặt hai hàm sau:
long long count_same_country(int N, std::vector<int> country_rank);
long long count_diff_country(int N, std::vector<int> country_rank);
country_rank là mảng độ dài \(N\); country_rank[i] là thứ hạng trong quốc gia của học sinh có thứ hạng toàn cuộc \(i\).Bài nộp không được cài đặt hàm main và phải khai báo #include "country.h".
country_rank.Trong 6 phần đầu, trình chấm chỉ gọi count_same_country.
| Phần | Điểm | Giới hạn thêm |
|---|---|---|
| 1 | 3 | \(N\le 8\) |
| 2 | 6 | country_rank chứa giá trị \(0\) không quá hai lần |
| 3 | 6 | country_rank không chứa giá trị \(2\) |
| 4 | 3 | \(N\le 300\) |
| 5 | 3 | \(N\le 2000\) |
| 6 | 9 | Không có giới hạn thêm |
Trong 6 phần cuối, trình chấm chỉ gọi count_diff_country.
| Phần | Điểm | Giới hạn thêm |
|---|---|---|
| 7 | 7 | \(N\le 8\) |
| 8 | 14 | country_rank chứa giá trị \(0\) không quá hai lần |
| 9 | 14 | country_rank không chứa giá trị \(2\) |
| 10 | 7 | \(N\le 300\) |
| 11 | 7 | \(N\le 2000\) |
| 12 | 21 | Không có giới hạn thêm |
Xét các lời gọi:
count_same_country(9, [0, 0, 1, 0, 2, 1, 3, 2, 1])
count_diff_country(9, [0, 0, 1, 0, 2, 1, 3, 2, 1])
Giả sử các học sinh có hạng toàn cuộc \(0\), \(1\), \(3\) lần lượt đại diện cho Singapore, Malaysia và Indonesia. Khi đó có bốn cách gán phù hợp:
| Hạng toàn cuộc | Hạng trong quốc gia | Cách 1 | Cách 2 | Cách 3 | Cách 4 |
|---|---|---|---|---|---|
| 0 | 0 | Singapore | Singapore | Singapore | Singapore |
| 1 | 0 | Malaysia | Malaysia | Malaysia | Malaysia |
| 2 | 1 | Singapore | Singapore | Malaysia | Malaysia |
| 3 | 0 | Indonesia | Indonesia | Indonesia | Indonesia |
| 4 | 2 | Singapore | Singapore | Malaysia | Malaysia |
| 5 | 1 | Malaysia | Indonesia | Singapore | Indonesia |
| 6 | 3 | Singapore | Singapore | Malaysia | Malaysia |
| 7 | 2 | Malaysia | Indonesia | Singapore | Indonesia |
| 8 | 1 | Indonesia | Malaysia | Indonesia | Singapore |
Có đúng bốn cặp bắt buộc cùng quốc gia:
Do đó lời gọi thứ nhất trả về 4.
Có đúng 17 cặp bắt buộc khác quốc gia:
Do đó lời gọi thứ hai trả về 17.
Với dữ liệu khác:
count_same_country(5, [0, 1, 0, 1, 2]) // trả về 2
count_diff_country(5, [0, 1, 0, 1, 2]) // trả về 4
Hai cặp bắt buộc cùng quốc gia là \((0,1)\) và \((2,3)\). Bốn cặp bắt buộc khác quốc gia là \((0,2)\), \((0,3)\), \((1,2)\) và \((1,3)\).
Trình chấm mẫu nhận \(N\), lựa chọn same hoặc diff, rồi mảng country_rank, sau đó gọi hàm tương ứng và in một số nguyên là giá trị trả về.
Nguồn: Southeast Asia Team Selection Test 2026, Ngày 1, bài Country Ranks.
Cho một cây có trọng số gồm \(N\) đỉnh, đánh số từ \(0\) đến \(N-1\). Với mỗi \(1\le i<N\), đỉnh \(i\) nối với cha \(P[i]\) bằng một cạnh có trọng số \(W[i]\), trong đó \(P[i]<i\) và \(W[i]\ge 0\). Đỉnh \(0\) không có cha; để thuận tiện, đặt \(P[0]=W[0]=-1\).
Sasaki chỉ có thể di chuyển giữa các đỉnh bằng cách dịch chuyển tức thời. Với mức năng lượng \(e\), Sasaki có thể dịch chuyển từ đỉnh \(u\) đến đỉnh \(v\) khi và chỉ khi đồng thời thỏa mãn:
Một đỉnh được coi là tổ tiên của chính nó. Phép dịch chuyển không tiêu hao năng lượng: sau mỗi lần dịch chuyển, Sasaki vẫn có mức năng lượng \(e\).
Cụ thể, \(u\) là tổ tiên của \(v\) nếu \(u=v\), hoặc \(u=P[v]\), hoặc \(u=P[P[v]]\), và tương tự sau một số lần đi từ một đỉnh lên cha của nó.
XOR theo bit của hai số nguyên không âm \(a,b\), ký hiệu \(a\oplus b\), có bit thứ \(k\) bằng \(1\) khi đúng một trong hai bit thứ \(k\) của \(a,b\) bằng \(1\), và bằng \(0\) trong trường hợp còn lại. Chẳng hạn:
XOR của nhiều số được thực hiện liên tiếp. Vì phép XOR có tính giao hoán và kết hợp, thứ tự các số và thứ tự thực hiện phép toán không ảnh hưởng đến kết quả cuối cùng.
Miyano cần trả lời \(Q\) truy vấn. Mỗi truy vấn cho hai đỉnh \(U,V\). Hãy tìm mức năng lượng nhỏ nhất để Sasaki có thể đi từ \(U\) đến \(V\) bằng không hoặc nhiều lần dịch chuyển.
Bạn cần cài đặt hai hàm sau:
void init(int N, std::vector<int> P, std::vector<int> W);
int minimum_energy(int U, int V);
init nhận số đỉnh, mảng cha và mảng trọng số. Hàm được gọi đúng một lần trước mọi lời gọi minimum_energy.minimum_energy nhận hai đỉnh của một truy vấn và phải trả về đáp án của truy vấn đó. Hàm được gọi đúng \(Q\) lần.Bài nộp không được cài đặt hàm main và phải khai báo #include "teleport.h".
| Phần | Điểm | Giới hạn thêm |
|---|---|---|
| 1 | 5 | \(N\le 10\) |
| 2 | 9 | \(W[i]\le 1\) với mọi \(1\le i<N\) |
| 3 | 15 | \(N\le 200\) |
| 4 | 28 | \(W[i]<128\) với mọi \(1\le i<N\) |
| 5 | 28 | \(N\le 10\,000\) |
| 6 | 15 | Không có giới hạn thêm |
Xét lời gọi khởi tạo:
init(6, [-1, 0, 1, 0, 1, 2], [-1, 3, 2, 0, 2, 1])
Sau đó:
minimum_energy(2, 4) trả về 1. Có thể dịch chuyển \(2\to0\) rồi \(0\to4\); XOR trên mỗi đường đi đều bằng \(1\).minimum_energy(3, 0) trả về 0, vì XOR trên đường \(3\to0\) bằng \(0\).minimum_energy(1, 1) trả về 0, vì điểm đầu và điểm cuối trùng nhau.minimum_energy(0, 5) trả về 0, vì XOR trên đường \(0\to5\) là \(3\oplus2\oplus1=0\).Trình chấm mẫu đọc dữ liệu theo định dạng:
N
P[1] P[2] ... P[N - 1]
W[1] W[2] ... W[N - 1]
Q
U[0] V[0]
U[1] V[1]
...
U[Q - 1] V[Q - 1]
Với mỗi truy vấn, trình chấm in giá trị do minimum_energy trả về trên một dòng.
Nguồn: Southeast Asia Team Selection Test 2026, Ngày 1, bài XOR Teleport.