IOI 2016 - Paint By Numbers
Xem PDFTô màu bằng số là một trò chơi đố nổi tiếng. Trong phiên bản một chiều của trò chơi, có một hàng gồm \(n\) ô, đánh số từ \(0\) đến \(n-1\) từ trái sang phải. Mỗi ô phải được tô đen hoặc trắng. Ký tự X biểu thị ô đen và _ biểu thị ô trắng.
Người chơi được cho một dãy gợi ý \(c=[c_0,\ldots,c_{k-1}]\) gồm \(k\) số nguyên dương. Các ô đen phải tạo thành đúng \(k\) khối liên tiếp, ngăn cách nhau bởi ít nhất một ô trắng. Khối thứ \(i\) từ trái sang, đánh số từ \(0\), phải có đúng \(c_i\) ô đen.
Ví dụ, với \(n=10\) và \(c=[3,4]\), cách tô _XXX__XXXX hợp lệ. Cách tô XXXX_XXX__ không hợp lệ vì hai khối có độ dài sai thứ tự. Cách tô __XXXXXXX_ cũng không hợp lệ vì chỉ có một khối đen thay vì hai khối tách biệt.
Bạn được cho một phần lời giải: ngoài \(n\) và \(c\), màu của một số ô đã được xác định là đen hoặc trắng. Một lời giải đúng phải thỏa mãn các gợi ý và giữ nguyên màu đã biết. Hãy xác định những ô đen trong mọi lời giải đúng, những ô trắng trong mọi lời giải đúng, và những ô có thể nhận cả hai màu ở các lời giải đúng khác nhau.
Dữ liệu luôn có ít nhất một lời giải đúng.
Chi tiết cài đặt
Trong C++, cài đặt hàm khai báo trong paint.h:
std::string solve_puzzle(std::string s, std::vector<int> c);
Trong Java, cài đặt phương thức sau trong lớp paint:
public String solve_puzzle(String s, int[] c)
Trong C, giao diện là:
void solve_puzzle(int n, char* s, int k, int* c, char* result);
s: xâu độ dài \(n\). Với \(0 \le i < n\),s[i]làXnếu ô \(i\) phải đen,_nếu phải trắng, và.nếu chưa có thông tin.c: mảng độ dài \(k\) chứa các gợi ý theo thứ tự từ trái sang phải.- Với C++ và Java, trả về xâu độ dài \(n\). Ký tự thứ \(i\) phải là
Xnếu ô đó đen trong mọi lời giải đúng,_nếu trắng trong mọi lời giải đúng, hoặc?nếu có cả lời giải tô đen và lời giải tô trắng ô đó. - Với C,
nlà độ dàis,klà số gợi ý. Ghi \(n\) ký tự của đáp án vào mảngresultđược cấp sẵn thay vì trả về xâu.
Mã ASCII của X, _, ., ? lần lượt là \(88,95,46,63\). Ký tự chưa biết ở đầu vào là ., còn ký tự chưa xác định được ở đầu ra là ?.
Nộp phần cài đặt hàm, không viết hàm main; sử dụng các tệp mẫu của ngôn ngữ tương ứng trong gói đính kèm. Khi nộp bằng C trên LQDOJ, dùng #include "paint.h" thay cho #include "paint_c.h" trong tệp mẫu; header dùng chung cung cấp đúng giao diện C ở trên.
Ràng buộc
- \(1 \le n \le 200\,000\).
- \(1 \le k \le n\) và \(1 \le c_i \le n\) với mọi \(0 \le i < k\).
schỉ gồm các ký tựX,_,..- Có ít nhất một lời giải đúng phù hợp với
svàc.
Phân nhóm
Mỗi subtask được tính trọn số điểm khi tất cả các test của subtask đó đều đúng; nếu không, subtask được \(0\) điểm. Các ràng buộc chung luôn áp dụng.
| Subtask | Điểm | Ràng buộc |
|---|---|---|
| 1 | 7 | \(1 \le n \le 20\), \(k=1\); s chỉ chứa .. |
| 2 | 3 | \(1 \le n \le 20\); s chỉ chứa .. |
| 3 | 22 | \(1 \le n \le 100\); s chỉ chứa .. |
| 4 | 27 | \(1 \le n \le 100\); s chỉ chứa . và _. |
| 5 | 21 | \(1 \le n \le 100\); s có thể chứa X, _, .. |
| 6 | 10 | \(1 \le n \le 5000\), \(1 \le k \le 100\); s có thể chứa X, _, .. |
| 7 | 10 | \(1 \le n \le 200\,000\), \(1 \le k \le 100\); s có thể chứa X, _, .. |
Ví dụ
Lời gọi thứ nhất:
Ví dụ 1
Input
solve_puzzle("..........", [3, 4])
Có đúng sáu cách tô hợp lệ:
Các cách tô hợp lệ
Output
XXX_XXXX__
XXX__XXXX_
XXX___XXXX
_XXX_XXXX_
_XXX__XXXX
__XXX_XXXX
Các ô \(2,6,7\) luôn đen. Mỗi ô còn lại đều có thể đen hoặc trắng tùy lời giải, nên đáp án là ??X???XX??.
Lời gọi thứ hai:
Ví dụ 2
Input
solve_puzzle("........", [3, 4])
Chỉ có một cách tô hợp lệ, nên đáp án là XXX_XXXX.
Lời gọi thứ ba:
Ví dụ 3
Input
solve_puzzle("..._._....", [3])
Không thể đặt khối ba ô đen vào giữa hai ô trắng \(3\) và \(5\), nên ô \(4\) cũng phải trắng. Đáp án là ???___????.
Lời gọi thứ tư:
Ví dụ 4
Input
solve_puzzle(".X........", [3])
Chỉ có hai cách tô hợp lệ là XXX_______ và _XXX______. Do đó đáp án là ?XX?______.
Trình chấm mẫu
Trình chấm mẫu đọc dòng đầu chứa xâu s; dòng tiếp theo chứa \(k\), rồi đến \(k\) số \(c_0,\ldots,c_{k-1}\). Chương trình in xâu kết quả của solve_puzzle trên một dòng.
Ví dụ 1 — dữ liệu cho trình chấm mẫu
Input
..........
2 3 4
Output
??X???XX??
Ví dụ 2 — dữ liệu cho trình chấm mẫu
Input
........
2 3 4
Output
XXX_XXXX
Ví dụ 3 — dữ liệu cho trình chấm mẫu
Input
..._._....
1 3
Output
???___????
Ví dụ 4 — dữ liệu cho trình chấm mẫu
Input
.X........
1 3
Output
?XX?______
Nguồn
IOI 2016, ngày thi thứ hai, bài Paint By Numbers. Đề tiếng Việt và gói tệp dành cho thí sinh được đính kèm.
Kỳ thi:
- IOI 2016 - Ngày 2 (16 Tháng 8., 2016)
Bình luận