JOI 2026 - Casino
Xem PDFAzzurro và Bordeaux đến một sòng bạc ở Ý và quyết định chơi trò chơi do người chia bài Chiaro đề xuất. Hai người được đưa vào hai phòng riêng biệt và chơi \(Q\) lượt. Trong mỗi lượt, Azzurro hành động trước, rồi đến Bordeaux: Azzurro nhận chuỗi \(S\) gồm A và B, độ dài \(L\), và tô xanh hoặc đỏ mọi ô của bảng \(8\times8\); Chiaro bí mật chọn một đường đi từ góc trên trái đến góc dưới phải, chỉ đi sang phải hoặc đi xuống, rồi đảo màu mọi ô trên đường đó; sau đó Bordeaux nhận bảng đã bị đảo màu và phải khôi phục \(S\).
Đây là bài Communication với hai tiến trình cô lập. Submission C++ của bạn phải cài đặt cả hai hàm dưới đây trong cùng một tệp; hai phía Azzurro và Bordeaux chạy trong hai tiến trình cô lập, không chia sẻ trạng thái với nhau. Không dùng standard input, standard output hoặc tệp khác; chỉ được ghi debug vào standard error.
std::vector<std::vector<int>> Azzurro(int N, int L, std::string S);
std::string Bordeaux(int N, int L, std::vector<std::vector<int>> T);
Azzurrotrả ma trận \(N\times N\) chỉ gồm0và1;0là xanh,1là đỏ.Bordeauxtrả chuỗi chỉ gồmAvàB, đúng độ dài \(L\).
Các hàng và cột được đánh số từ \(0\) đến \(N-1\), lần lượt từ trên xuống dưới và từ trái sang phải. Mỗi đường đi của Chiaro bắt đầu ở \((0,0)\), kết thúc ở \((N-1,N-1)\) và mỗi bước chỉ đến ô kề ngay bên phải hoặc ngay phía dưới. Cả ô đầu và ô cuối đều bị đảo màu.
Ở lượt \(i\), Azzurro nhận \(N\), độ dài \(L_i\), chuỗi \(S_i\) và bảng ban đầu toàn màu trắng; sau đó phải tô mọi ô thành xanh hoặc đỏ. Bordeaux nhận \(N\), \(L_i\) và bảng sau khi Chiaro đảo màu, nhưng không nhận \(S_i\) hay đường đi. Mục tiêu là Bordeaux trả lại đúng chuỗi \(S_i\).
Trong Bordeaux, T[r][c] là màu của ô \((r,c)\): \(0\) là xanh và \(1\) là đỏ. Trả về ma trận sai kích thước hoặc có phần tử khác \(0,1\) bị chấm Wrong Answer [1]; trả về chuỗi sai độ dài hoặc có ký tự ngoài A, B bị chấm Wrong Answer [2]. Chuỗi đúng định dạng nhưng đoán sai được xử lý theo phần chấm điểm.
Có thể khai báo hàm phụ và biến toàn cục. Hãy đặt các hàm nội bộ và biến toàn cục trong namespace không tên để tránh xung đột với các tệp khác. Hai tiến trình Azzurro và Bordeaux không chia sẻ biến toàn cục.
Biên dịch và chạy thử
Khi nộp lên LQDOJ, dùng một tệp có #include "casino.h" và hiện thực cả hai hàm. Để chạy thử, biên dịch casino.cpp với trình mẫu grader.cpp bằng:
g++ -std=gnu++20 -O2 -o grader grader.cpp casino.cpp
Có thể chạy sh compile.sh trong gói thay cho lệnh trên. Nếu biên dịch thành công, tệp thực thi grader được tạo ra.
Gói gốc chính thức dùng hai tệp Azzurro.cpp, Bordeaux.cpp, lần lượt include Azzurro.h, Bordeaux.h, và biên dịch bằng g++ -std=gnu++20 -O2 -o grader grader.cpp Azzurro.cpp Bordeaux.cpp. Đây là bố cục của gói gốc, không phải yêu cầu nộp hai tệp trên LQDOJ.
Trình mẫu chạy trong một tiến trình, khác với hai tiến trình cô lập khi chấm thật. Trình mẫu đọc stdin theo dạng:
Q N
L_1
S_1
R_1
L_2
S_2
R_2
...
L_Q
S_Q
R_Q
\(R_i\) có độ dài \(2(N-1)\), gồm đúng \(N-1\) ký tự D và \(N-1\) ký tự R. Bắt đầu từ \((0,0)\), đọc lần lượt các ký tự: D là đi xuống một ô, R là đi sang phải một ô. Chuỗi mô tả đường đi của Chiaro.
Trình mẫu in kết quả dạng Accepted: 26, trong đó số là ngưỡng độ dài \(L^*\) được định nghĩa ở phần chấm điểm, hoặc dạng Wrong Answer [1] với mã lỗi tương ứng. Nếu nhiều điều kiện chấm sai cùng xảy ra, chỉ một điều kiện được báo; trình mẫu có thể kết thúc ngay khi phát hiện điều kiện đó.
Dữ liệu vào
Bài nộp nhận dữ liệu qua các đối số của Azzurro và Bordeaux, không đọc stdin. Định dạng dữ liệu để chạy thử với trình mẫu được mô tả ở trên.
Dữ liệu ra
Submission không có standard output; kết quả được trả qua hai hàm chiến lược.
Ràng buộc
- \(N=8\).
- \(1\le Q\le30000\).
- \(1\le L\le51\).
- Chuỗi \(S_i\) có đúng \(L_i\) ký tự, chỉ gồm
AvàB. - \(Q,L_i\) là các số nguyên.
- Chuỗi đường đi \(R_i\) có đúng \(N-1\) ký tự
Dvà \(N-1\) ký tựR. - Mỗi hàm được gọi đúng \(Q\) lần. Đường đi của mỗi lượt được cố định trước khi gọi
AzzurrovàBordeaux; grader không thích nghi theo kết quả trả về.
Phân nhóm
Nếu một testcase có ma trận hoặc chuỗi trả về không hợp lệ, lỗi thực thi, quá thời gian, hoặc quá bộ nhớ thì nhận \(0\) điểm. Ngược lại, với mỗi testcase đặt \(L\) là độ dài lớn nhất sao cho mọi lượt có \(L_i\le L\) đều được giải đúng; nếu giải đúng mọi lượt của testcase thì đặt ngưỡng này bằng \(51\). Lấy \(L^*\) là giá trị nhỏ nhất trong các ngưỡng của mọi testcase. Điểm được tính như sau:
- \(1\le L^*\le28\): \(2L^*\) điểm.
- \(29\le L^*\le39\): \(L^*+28\) điểm.
- \(40\le L^*\le50\): \(67+3(L^*-40)\) điểm.
- \(L^*=51\): \(100\) điểm.
Ví dụ giao tiếp
Grader mẫu dùng \(N=2\) chỉ để minh họa giao tiếp (dữ liệu chấm chính thức có \(N=8\)):
Dữ liệu vào đầy đủ của trình mẫu là:
2 2
1
B
RD
3
ABB
DR
| Dữ liệu lượt | Lời gọi | Giá trị trả về |
|---|---|---|
\(L=1\), \(S=\texttt{B}\), đường đi RD |
Azzurro(2, 1, "B") |
[[1, 0], [0, 1]] |
| Bảng sau khi đảo màu | Bordeaux(2, 1, [[0, 1], [0, 0]]) |
"B" |
\(L=3\), \(S=\texttt{ABB}\), đường đi DR |
Azzurro(2, 3, "ABB") |
[[0, 0], [0, 0]] |
| Bảng sau khi đảo màu | Bordeaux(2, 3, [[1, 0], [1, 1]]) |
"ABB" |
Ở lượt đầu, Chiaro đảo màu đường \((0,0)\to(0,1)\to(1,1)\); ở lượt hai, Chiaro đảo màu đường \((0,0)\to(1,0)\to(1,1)\). Bordeaux khôi phục đúng chuỗi trong cả hai lượt.
Ở lượt đầu, Azzurro tô các ô \((0,1),(1,0)\) xanh, các ô \((0,0),(1,1)\) đỏ. Sau khi Chiaro đảo màu, ba ô trên đường đi \((0,0),(0,1),(1,1)\) lần lượt có màu xanh, đỏ, xanh. Bordeaux ghi B và thắng.
Ở lượt hai, Azzurro tô mọi ô xanh. Sau khi Chiaro đảo màu, ba ô trên đường đi \((0,0),(1,0),(1,1)\) đều đỏ. Bordeaux ghi ABB và thắng.
sample-01-in.txt trong gói tương ứng với ví dụ này và không thỏa ràng buộc chính thức. sample-02-in.txt là dữ liệu mẫu thỏa ràng buộc chính thức.
Nguồn
JOI 2025/2026 Final Stage, Cuộc thi 2, bài Casino, Japanese Committee for IOI. Bản dịch được đối chiếu với đề gốc tiếng Nhật và bản tiếng Anh. Đề gốc, bản dịch và bản điều chỉnh được cung cấp theo CC BY-SA 4.0.
Kỳ thi:
- JOI 2026 - Chung kết - Cuộc thi 2 (22 Tháng ba, 2026)
Bình luận