| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | IOI 2022 - Catfish Farm | 100 (p) | 1.0s | 2G |
| 2 | IOI 2022 - Prisoner Challenge | 100 (p) | 1.0s | 2G |
| 3 | IOI 2022 - Radio Towers | 100 (p) | 4.0s | 2G |
Bu Dengklek sở hữu một trang trại nuôi cá da trơn.
Trang trại cá da trơn là một ao bao gồm một lưới \(N \times N\) ô vuông.
Mỗi ô là một hình vuông cùng kích thước.
Các cột của lưới được đánh số từ \(0\) đến \(N - 1\) từ tây sang đông và các hàng được đánh số từ \(0\) đến \(N - 1\) từ nam sang bắc.
Gọi ô nằm ở cột \(c\) và hàng \(r\) của lưới (\(0 \le c \le N - 1\), \(0 \le r \le N - 1\)) là ô \((c, r)\).
Trong ao có \(M\) con cá da trơn, được đánh số từ \(0\) đến \(M - 1\), nằm ở các ô riêng biệt.
Với mỗi \(i\) mà \(0 \le i \le M - 1\), con cá \(i\) nằm ở ô \((X[i], Y[i])\) và nặng \(W[i]\) gam.
Bu Dengklek muốn xây một số cầu để bắt cá da trơn.
Một cầu trong cột \(c\) có chiều dài \(k\) (với mọi \(0 \le c \le N - 1\) và \(1 \le k \le N\)) là một hình chữ nhật kéo dài từ hàng \(0\) đến hàng \(k - 1\), bao gồm các ô \((c, 0), (c, 1), \ldots, (c, k - 1)\).
Đối với mỗi cột, Bu Dengklek có thể chọn xây cầu có độ dài theo ý mình hoặc không xây cầu.
Con cá \(i\) (với mỗi \(i\) sao cho \(0 \le i \le M - 1\)) có thể đánh bắt được nếu có cầu ngay sát phía tây hoặc phía đông ô của nó và không có cầu che ô của nó; nghĩa là, nếu
Ví dụ, xét một ao có kích thước \(N = 5\) với \(M = 4\) con cá da trơn:
Sau đây là một cách Bu Dengklek có thể xây dựng các cầu:
| Trước khi các cầu được xây dựng | Sau khi các cầu được xây dựng |
|---|---|
![]() |
![]() |
Con số trong một ô chỉ trọng lượng của con cá da trơn ở ô đó.
Các ô tô đậm là các ô được che bởi các cầu.
Trong trường hợp này, có thể đánh bắt được con cá da trơn \(0\) (tại ô \((0, 2)\)) và con cá da trơn \(3\) (tại ô \((3, 3)\)).
Không thể đánh bắt được con cá da trơn \(1\) (tại ô \((1, 1)\)) vì có một cầu che vị trí của nó, trong khi không thể đánh bắt được con cá da trơn \(2\) (tại ô \((4, 4)\)) vì không có cầu ngay sát phía tây và phía đông ô của nó.
Bu Dengklek muốn xây các cầu sao cho tổng trọng lượng các cá da trơn mà cô có thể bắt được càng lớn càng tốt.
Nhiệm vụ của bạn là tìm tổng trọng lượng lớn nhất các cá da trơn mà Bu Dengklek có thể bắt được sau khi xây các cầu.
Bạn cần cài đặt các hàm sau:
long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y,
std::vector<int> W);
Xét lời gọi hàm sau:
max_weights(5, 4, [0, 1, 4, 3], [2, 1, 4, 3], [5, 2, 1, 3])
Ví dụ này được minh hoạ trong phần mô tả bài toán ở trên.
Sau khi xây dựng các cầu như mô tả, Bu Dengklek có thể đánh bắt được con cá \(0\) và \(3\), có tổng trọng lượng là \(5 + 3 = 8\) gam.
Vì không có cách nào xây các cầu để bắt các cá da trơn với tổng trọng lượng lớn hơn \(8\) gam, hàm cần trả về \(8\).
Trình chấm mẫu đọc dữ liệu vào theo định dạng sau:
Trình chấm mẫu in ra câu trả lời của bạn theo định dạng sau:
max_weightsNguồn: Đề thi tiếng Việt IOI 2022, giấy phép CC-BY.
Trong một nhà tù có \(500\) tù nhân.
Một ngày kia, quản ngục cho họ một cơ hội để tự giải thoát.
Quản ngục để hai túi tiền, túi A và túi B, trong một căn phòng.
Mỗi túi chứa một số lượng xu nằm trong khoảng từ \(1\) đến \(N\), bao gồm cả hai đầu mút.
Số lượng xu trong túi A khác số lượng xu trong túi B.
Quản ngục đưa ra một thử thách cho các tù nhân.
Mục tiêu của các tù nhân là xác định túi nào chứa ít xu hơn.
Trong căn phòng, cùng với hai túi tiền, còn có một bảng trắng.
Lúc nào trên bảng cũng có ghi một số nguyên.
Ban đầu, trên bảng ghi số \(0\).
Sau đó, quản ngục gọi lần lượt từng tù nhân vào trong phòng.
Mỗi tù nhân khi vào phòng không biết ai hay bao nhiêu tù nhân khác đã vào phòng trước mình.
Mỗi lần một tù nhân vào phòng, anh ta đọc số đang có trên bảng.
Sau khi đọc xong, anh ta phải chọn một trong hai túi A hoặc B.
Sau đó, tù nhân kiểm tra túi được chọn và biết được số lượng xu nằm trong túi đó.
Tiếp theo, tù nhân phải thực hiện một trong hai hành động sau:
Quản ngục sẽ không bao giờ yêu cầu một tù nhân đã rời khỏi phòng vào lại phòng lần thứ hai.
Các tù nhân sẽ giành chiến thắng thử thách này nếu một trong số họ xác định chính xác túi nào có ít xu hơn.
Họ sẽ thua nếu bất kì ai trong số họ xác định sai, hoặc tất cả \(500\) tù nhân đều đã vào phòng và không xác định được túi có ít xu hơn.
Trước khi thử thách bắt đầu, các tù nhân tập trung trong sảnh chính của nhà tù và cùng quyết định một chiến thuật chung cho thử thách này với ba bước.
Nếu như giành chiến thắng thử thách này, quản ngục sẽ thả các tù nhân sau khi họ chịu án thêm \(x\) ngày nữa.
Bạn hãy tạo ra một chiến thuật cho các tù nhân để đảm bảo rằng họ sẽ giành chiến thắng thử thách này (bất kể số lượng xu trong túi A và túi B là bao nhiêu).
Điểm của bạn sẽ phụ thuộc vào giá trị \(x\) (xem chi tiết ở phần Subtask).
Bạn cần cài đặt hàm sau:
std::vector<std::vector<int>> devise_strategy(int N);
Xét lời gọi hàm sau:
devise_strategy(3)
Gọi \(v\) là số mà tù nhân đọc được trên bảng khi vào phòng.
Một trong các chiến thuật đúng như sau:
Chiến thuật này có thể được xác định bằng cách trả về [[0, -1, 1, -2], [1, -2, 0, -1]].
Độ dài của mảng đươc trả về là \(2\), vì vậy với giá trị trả về này thì giá trị của \(x\) là \(2 - 1 = 1\).
Nếu trong bất cứ test case nào, mảng trả về bởi hàm devise_strategy không thể hiện một chiến thuật đúng, điểm cho lời giải của bạn với subtask đó sẽ là \(0\).
Trong subtask 3, bạn có thể có điểm lẻ.
Gọi \(m\) là giá trị lớn nhất của \(x\) đối với tất cả các test case trong subtask này.
Điểm của bạn cho subtask này sẽ được tính dựa trên bảng sau:
| Điều kiện | Điểm |
|---|---|
| \(40 \le m \le 60\) | \(20\) |
| \(26 \le m \le 39\) | \(25 + 1.5 \times (40 - m)\) |
| \(m = 25\) | \(50\) |
| \(m = 24\) | \(55\) |
| \(m = 23\) | \(62\) |
| \(m = 22\) | \(70\) |
| \(m = 21\) | \(80\) |
| \(m \le 20\) | \(90\) |
Trình chấm mẫu đọc dữ liệu theo định dạng sau:
Mỗi dòng trừ dòng đầu và dòng cuối thể hiện một kịch bản.
Kịch bản được ghi trên dòng thứ \(2 + k\) là kịch bản thứ \(k\).
Trong kịch bản \(k\), túi A chứa \(A[k]\) xu và túi B chứa \(B[k]\) xu.
Trình chấm mẫu sẽ gọi hàm devise_strategy(N).
Giá trị của \(x\) là độ dài của mảng trả về trừ đi một.
Sau đó, nếu trình chấm mẫu xác định rằng mảng trả về bởi hàm devise_strategy không tuân theo các ràng buộc được mô tả trong phần Chi tiết cài đặt, trình chấm mẫu sẽ in ra một trong các lỗi sau và kết thúc:
s is an empty array: \(s\) là một mảng rỗng (không phải là một chiến thuật đúng đắn).s[i] contains incorrect length: Tồn tại một chỉ số \(i\) (\(0 \le i \le x\)) mà độ dài của mảng \(s[i]\) không phải là \(N + 1\).First element of s[i] is non-binary: Tồn tại một chỉ số \(i\) (\(0 \le i \le x\)) mà \(s[i][0]\) không phải là \(0\) hay \(1\).s[i][j] contains incorrect value: Tồn tại cặp chỉ số \(i, j\) (\(0 \le i \le x, 1 \le j \le N\)) mà \(s[i][j]\) có giá trị không nằm trong khoảng \(-2\) và \(x\).Ngược lại, trình chấm mẫu đưa ra hai luồng kết quả đầu ra.
Luồng thứ nhất, trình chấm mẫu in ra kết quả của chiến thuật của bạn theo định dạng như sau:
A.B.X.Luồng thứ hai, trình chấm mẫu viết ra một file log.txt trong thư mục hiện tại với định dạng như sau:
Dãy số trên dòng thứ \(1 + k\) tương ứng với kịch bản \(k\) mô tả các số được viết trên bảng.
Cụ thể, \(w[k][l]\) là số được viết bởi tù nhân thứ \(l + 1\).
Nguồn: Đề thi tiếng Việt IOI 2022, giấy phép CC-BY.
Có \(N\) tháp phát thanh ở Jakarta. Các tháp nằm dọc theo một đường thẳng và được đánh số từ \(0\) đến \(N - 1\) từ trái sang phải. Với mỗi \(i\) sao cho \(0 \le i \le N - 1\), chiều cao của tháp \(i\) là \(H[i]\) mét. Chiều cao của các tháp là phân biệt.
Đối với một giá trị nhiễu \(\delta\) dương nào đó, một cặp tháp \(i\) và \(j\) (trong đó \(0 \le i < j \le N - 1\)) có thể giao tiếp với nhau khi và chỉ khi có một tháp trung gian \(k\), sao cho
Pak Dengklek muốn thuê một số tháp cho mạng phát thanh mới của mình.
Nhiệm vụ của bạn là trả lời \(Q\) câu hỏi của Pak Dengklek có dạng như sau:
cho trước các tham số \(L, R\) và \(D\) (\(0 \le L \le R \le N - 1\) và \(D > 0\)), số lượng tháp tối đa mà Pak Dengklek có thể thuê là bao nhiêu, giả sử rằng
Lưu ý rằng hai tháp đã thuê có thể giao tiếp bằng cách sử dụng tháp trung gian \(k\), bất kể tháp \(k\) có được thuê hay không.
Bạn cần cài đặt các hàm sau:
void init(int N, std::vector<int> H);
max_towers.int max_towers(int L, int R, int D);
Hãy xem xét dãy các lời gọi sau:
init(7, [10, 20, 60, 40, 50, 30, 70])
max_towers(1, 5, 10)
Pak Dengklek có thể thuê tháp \(1\), \(3\) và \(5\).
Ví dụ được minh họa trong hình sau, trong đó các hình thang được tô đậm thể hiện cho các tháp được thuê.
Tháp \(3\) và \(5\) có thể giao tiếp bằng cách sử dụng tháp \(4\) làm trung gian, vì \(40 \le 50 - 10\) và \(30 \le 50 - 10\). Các tháp \(1\) và \(3\) có thể giao tiếp bằng cách sử dụng tháp \(2\) làm trung gian. Tháp \(1\) và \(5\) có thể giao tiếp bằng cách sử dụng tháp \(3\) làm trung gian.
Không có cách nào để thuê được nhiều hơn \(3\) tháp, do đó hàm phải trả lại \(3\).
max_towers(2, 2, 100)
Có duy nhất tháp \(1\) trong phạm vi, do đó Pak Dengklek chỉ có thể thuê tháp \(1\).
Vì vậy, thủ tục sẽ trả về \(1\).
max_towers(0, 6, 17)
Pak Dengklek có thể thuê tháp \(1\) và \(3\).
Các tháp \(1\) và \(3\) có thể giao tiếp bằng cách sử dụng tháp \(2\) làm trung gian, vì \(20 \le 60 - 17\) and \(40 \le 60 - 17\). Không có cách nào để thuê nhiều hơn \(2\) tháp, do đó hàm phải trả lại \(2\).
max_towers.Trình chấm mẫu đọc dữ liệu vào theo định dạng:
Trình chấm mẫu in các kết quả của bạn theo định dạng:
max_towers cho câu hỏi \(j\)Nguồn: Đề thi tiếng Việt IOI 2022, giấy phép CC-BY.