| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | NOI Singapore 2026 - Monkeys | 100 (p) | 1.0s | 1G |
| 2 | NOI Singapore 2026 - Famished Cats | 100 (p) | 1.0s | 1G |
| 3 | NOI Singapore 2026 - 3 Raptors | 100 (p) | 2.0s | 1G |
| 4 | NOI Singapore 2026 - Gemstones | 100 (p) | 2.5s | 1G |
| 5 | NOI Singapore 2026 - Lemon | 100 (p) | 5.0s | 2G |
Monkeyland là một trục số vô hạn có \(n\) con khỉ, đánh số từ \(1\) đến \(n\). Ban đầu con thứ \(i\) ở vị trí \(p_i\); nhiều con có thể cùng vị trí.
Chuyển động của các con khỉ được xác định bởi chuỗi \(d\) dài \(n\):
L, con thứ \(i\) dịch sang trái một đơn vị;R, con thứ \(i\) dịch sang phải một đơn vị.Mỗi ngày Pan niệm phép đúng một lần. Hai con khỉ trở thành bạn nếu chúng từng ở cùng vị trí vào bất kỳ ngày nào, kể cả lúc ban đầu. Nếu Pan niệm phép trong \(k\) ngày, hãy đếm số cặp khỉ trở thành bạn.
In một số nguyên: số cặp khỉ trở thành bạn.
Mỗi \(d_i\) là L hoặc R.
| Phần | Điểm | Giới hạn thêm |
|---|---|---|
| 1 | 6 | \(n=2\) |
| 2 | 13 | \(d_1=d_2=\cdots=d_n\) |
| 3 | 10 | \(n,k\le200\) |
| 4 | 22 | \(n,k\le3000\) |
| 5 | 18 | \(n\le3000\) |
| 6 | 31 | Không có giới hạn thêm |
Ví dụ 1
2 1
1 3
RL
1
Sau ngày đầu, cả hai con đều ở vị trí \(2\) nên trở thành bạn.
Ví dụ 2
5 67
1 2 3 4 5
RRRRR
0
Mọi con cùng đi sang phải và ban đầu ở các vị trí khác nhau, nên không cặp nào gặp nhau.
Ví dụ 3
6 7
1 1 8 16 18 22
RRLRLL
3
Ví dụ 4
10 30
9 46 27 8 12 100 56 96 6 7
LRLRRLRRLR
5
Ví dụ 5
4 2
3 4 4 6
LLRL
2
Vương quốc mèo nằm dọc một con đường rất dài từ tây sang đông. Ngân hàng thức ăn ở đầu phía tây. Có \(n\) ngôi nhà mèo về phía đông, đánh số từ \(1\) đến \(n\); \(n\) là số chẵn. Nhà \(1\) cách ngân hàng \(d_1\) km. Với \(i\ge2\), nhà \(i\) cách nhà \(i-1\) một đoạn \(d_i\) km.
Hình 1: Ngân hàng thức ăn và các nhà mèo theo thứ tự từ tây sang đông; \(d_i\) là khoảng cách đến vị trí liền trước.
Ket lái xe tải giao thức ăn từ ngân hàng với \(x\) đơn vị nhiên liệu. Một đơn vị nhiên liệu cho phép đi \(1\) km. Nhà \(i\) có \(f_i\) đơn vị nhiên liệu mà xe có thể lấy. Xe chứa nhiên liệu không giới hạn, chỉ dừng khi hết nhiên liệu và không cần quay về.
Ket có thể dùng đũa phép để hoán đổi lượng nhiên liệu ở nhà \(i\) và nhà \(n-i+1\). Chỉ được hoán đổi khi nhiên liệu ở cả hai nhà chưa được sử dụng.
Hãy tìm chỉ số xa nhất \(D\) của ngôi nhà Ket có thể tới sau một số bất kỳ phép hoán đổi, đồng thời tìm số phép hoán đổi nhỏ nhất \(S\) cần để tới được nhà \(D\).
In hai số nguyên \(D\) và \(S\).
| Phần | Điểm | Giới hạn thêm |
|---|---|---|
| 1 | 7 | Tồn tại hằng số \(k\) sao cho $ |
| 2 | 12 | \(n\le40\) |
| 3 | 14 | \(f_i\le f_{i+1}\) với mọi \(1\le i<n\) |
| 4 | 19 | \(D\le n/2\) |
| 5 | 21 | \(n\le5000\) |
| 6 | 27 | Không có giới hạn thêm |
Ví dụ 1
6 1
1 1 3 1 1 6
1 1 1 4 3 2
5 1
Ket tới nhà \(1\), lấy nhiên liệu rồi tới nhà \(2\). Hoán đổi nhiên liệu ở nhà \(2\) và \(5\) giúp xe lần lượt tới nhà \(3\), \(4\), \(5\). Xe còn \(4\) đơn vị nhưng cần \(6\) để tới nhà \(6\), nên \(D=5\) và số hoán đổi nhỏ nhất là \(S=1\).
Hình 2: Khoảng cách, nhiên liệu ban đầu và hành trình trong ví dụ 1.
Ví dụ 2
6 5
3 8 3 1 4 1
2 7 1 6 2 7
6 1
Ví dụ 3
6 2
2 24 25 40 5 11
4 12 14 16 20 30
3 2
Ví dụ 4
6 10
3 6 3 7 8 6
4 3 1 7 1 6
5 1
Có \(n\) con khủng long xếp thành một hàng từ trái sang phải, đánh số từ \(1\) đến \(n\). Con thứ \(i\) có màu \(c_i\in\{1,2,3\}\).
WhiteRaptor được phép bỏ một số con (có thể bằng \(0\)) ở đầu trái và đầu phải, rồi giữ lại toàn bộ đoạn liên tiếp còn lại.
Trong đoạn được giữ, xét tần suất của cả ba màu. Nếu một màu không xuất hiện thì tần suất của nó bằng \(0\). WhiteRaptor yêu cầu hiệu giữa tần suất lớn nhất và nhỏ nhất không vượt quá \(k\).
Hãy tìm số khủng long lớn nhất có thể giữ lại. Được phép giữ đoạn rỗng.
In số lượng lớn nhất có thể giữ.
| Phần | Điểm | Giới hạn thêm |
|---|---|---|
| 1 | 5 | \(n\le500\) |
| 2 | 9 | \(n\le2000\) |
| 3 | 11 | \(c_i\le2\) |
| 4 | 15 | \(k=0\) |
| 5 | 16 | Tồn tại \(1\le j\le n\) sao cho \(c_i\ne3\) với mọi \(i\le j\), và \(c_i=3\) với mọi \(i>j\) |
| 6 | 20 | Trong mọi đoạn liên tiếp gồm ít nhất \(3\) con, màu \(3\) có tần suất nhỏ nhất |
| 7 | 24 | Không có giới hạn thêm |
Ví dụ 1
11 2
2 2 1 2 1 3 2 1 2 1 1
7
Đoạn từ vị trí \(3\) đến \(9\) có tần suất các màu \(1,2,3\) lần lượt là \(3,3,1\), nên hiệu bằng \(2\). Không có đoạn hợp lệ dài hơn.
Ví dụ 2
6 2
2 1 3 3 3 3
5
Có thể giữ đoạn từ vị trí \(1\) đến \(5\).
Ví dụ 3
7 0
1 2 1 2 1 2 1
0
Mọi đoạn không rỗng đều không chứa màu \(3\), nên tần suất nhỏ nhất là \(0\) và không thể có ba tần suất bằng nhau. Ví dụ này thỏa phần \(5\) khi chọn \(j=n\).
Có \(n\) viên đá quý xếp thành một hàng, đánh số từ \(1\) đến \(n\). Viên thứ \(i\) có màu \(c_i\).
Trong một thao tác, bạn chọn hai viên kề nhau và cùng màu rồi xóa cả hai. Các viên ở hai phía trượt lại để lấp khoảng trống, có thể tạo ra những cặp kề nhau mới.
Có \(q\) kịch bản độc lập. Trong kịch bản thứ \(j\), chỉ xét đoạn đá từ \(l_j\) đến \(r_j\). Nếu thực hiện tối ưu các thao tác, hãy tìm số viên nhỏ nhất còn lại.
In \(q\) dòng; dòng thứ \(j\) là đáp án của kịch bản thứ \(j\).
| Phần | Điểm | Giới hạn thêm |
|---|---|---|
| 1 | 2 | \(c_1=c_2=\cdots=c_n\) |
| 2 | 5 | Các viên cùng màu tạo thành một đoạn liên tiếp |
| 3 | 9 | \(n,q\le2000\) |
| 4 | 4 | \(l_j=1\) với mọi truy vấn |
| 5 | 8 | Mỗi màu xuất hiện đúng hai lần |
| 6 | 16 | \(c_i\le2\) |
| 7 | 18 | \(n,q\le100\,000\) |
| 8 | 15 | \(n,q\le300\,000\) |
| 9 | 23 | Không có giới hạn thêm |
Ví dụ 1
8 4
3 3 3 2 2 3 4 7
1 3
3 6
1 7
5 8
1
0
1
4
Trong truy vấn đầu, xóa hai trong ba viên màu \(3\) và còn lại một viên. Truy vấn thứ hai có thể xóa hết. Truy vấn thứ ba còn tối thiểu một viên. Trong truy vấn cuối không thể thực hiện thao tác nào.
Hình 1: Dãy đá quý ban đầu của ví dụ 1.
Hình 2: Xóa một cặp đá kề nhau cùng màu.
Hình 3: Sau lần xóa đầu, một cặp cùng màu mới trở nên kề nhau và có thể bị xóa tiếp.
Ví dụ 2
6 3
2 1 1 2 2 1
1 6
1 4
3 6
2
0
0
Đây là bài tương tác hai tiến trình. Chỉ các ngôn ngữ C++ tương thích chữ ký được hỗ trợ. Không đọc từ đầu vào chuẩn và không ghi ra đầu ra chuẩn.
Có \(n\) loại trái cây mang nhãn đôi một khác nhau từ \(1\) đến \(n\). Đúng một quả là chanh; Takina và Chisato chưa biết nhãn của nó. Takina nhận lần lượt cả \(n\) quả và phải truyền nhãn quả chanh cho Chisato, người không quan sát quá trình này.
Trước khi nhận trái cây, Takina biết mảng hoán vị \(p\): quả thứ \(i\) được đưa tới có nhãn \(p_i\). Takina viết một chuỗi nhị phân \(b\) dài không quá \(5000\) (có thể rỗng). Gọi \(x=|b|\).
Khi nhận từng quả, Takina được biết nó có phải chanh hay không. Nếu không phải chanh, cô có thể quyết định ăn hoặc không ăn ngay lúc đó; quyết định không thể thay đổi. Nếu là chanh, cô không được ăn. Gọi \(y\) là tổng số quả đã ăn.
Cuối cùng Chisato nhận chuỗi \(b\) và danh sách tăng dần nhãn của các quả không bị ăn. Từ đó cô phải xác định nhãn quả chanh. Có \(t\) ván trong mỗi test.
Bạn phải cài đặt ba hàm sau trong tệp lời giải.
std::string init(int subtask, int n, std::vector<int> p);
subtask: chỉ số phần chấm của test.n: số trái cây.p: vector dài \(n+1\), với \(p[0]=0\) và \(p[i]\) là nhãn quả thứ \(i\) được đưa tới.bool receive_fruit(int id, bool is_lemon);
id: nhãn quả vừa được đưa tới.is_lemon: true khi quả đó là chanh.true nếu Takina ăn quả, false nếu không. Trả về true khi is_lemon=true sẽ bị Wrong Answer.int answer(int subtask, int n, std::string b,
std::vector<int> uneaten);
b: chuỗi do init trả về.uneaten: vector tăng dần dài \(n-y+1\), trong đó uneaten[0]=0, các phần tử sau là nhãn những quả không bị ăn.Trình chấm chạy lời giải hai lượt:
init, rồi gọi receive_fruit theo thứ tự \(p\) trong từng ván. Lời giải được giữ trạng thái giữa các lần gọi.answer. Ngoài các tham số của answer, chương trình không được truy cập thông tin từ lượt đầu.Các hàm được gọi nhiều lần, vì vậy phải xử lý đúng trạng thái còn lại từ ván trước.
\(p\) là hoán vị của \(1,2,\ldots,n\) và mỗi ván có đúng một quả chanh.
Điểm của mỗi test dùng giá trị \(x\) lớn nhất và \(y\) lớn nhất trong tất cả \(t\) ván của test đó.
| Phần | Điểm tối đa | Công thức |
|---|---|---|
| 1 | 10 | Nếu \(y>2\) thì \(0\) điểm; ngược lại \(10\min(288/x,1)\) |
| 2 | 30 | Nếu \(y>9\) thì \(0\) điểm; ngược lại \(30\min(30/x,1)\) |
| 3 | 60 | \(60\min(20/(x+y),1)\) |
Xét một ván minh họa với \(n=4\) (không thỏa giới hạn thật), \(p=[0,3,1,4,2]\) và quả chanh có nhãn \(4\):
| Bước | Lời gọi | Giá trị trả về |
|---|---|---|
| 1 | init(subtask, 4, [0,3,1,4,2]) |
"101" |
| 2 | receive_fruit(3, false) |
true |
| 3 | receive_fruit(1, false) |
false |
| 4 | receive_fruit(4, true) |
false |
| 5 | receive_fruit(2, false) |
true |
| 6 | answer(subtask, 4, "101", [0,1,4]) |
4 |
Takina ăn các quả nhãn \(3\) và \(2\), nên uneaten=[0,1,4]. Chiến lược xác định đúng nhãn \(4\) với \(x=3,y=2\).
Tệp đính kèm cung cấp lemon.h, lời giải mẫu khung, trình chấm mẫu và hai dữ liệu mẫu để kiểm thử cục bộ. Trình chấm mẫu chỉ chạy một lượt và không đổi thứ tự ván, khác với trình chấm chính thức.