| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2023 - Ancient Machine 2 | 100 (p) | 2.0s | 1G |
| 2 | JOI 2023 - Cell Automaton | 100 (p) | 6.0s | 2G |
| 3 | JOI 2023 - Garden | 100 (p) | 2.0s | 1G |
Bitaro và Bibako là hai nhà khảo cổ khai quật và nghiên cứu tàn tích của Vương quốc JOI. Trong tàn tích, Bitaro tìm thấy một phiến đá cổ, còn Bibako tìm thấy một cỗ máy cổ.
Qua nghiên cứu, Bitaro biết rằng trên phiến đá có một xâu \(S\) độ dài \(N\), mỗi ký tự là 0 hoặc 1. Tuy nhiên, anh chưa biết các ký tự của \(S\).
Bibako đã tìm ra cách sử dụng cỗ máy. Để đặt một câu hỏi, họ đặt phiến đá lên máy và nhập một số nguyên \(m\) cùng hai dãy số nguyên \(a,b\), thỏa mãn:
Máy xử lý một câu hỏi và hiển thị một số nguyên như sau:
0, máy thay giá trị trong vùng nhớ bằng \(a_x\); nếu \(S_i\) là 1, máy thay giá trị đó bằng \(b_x\). Các phần tử của \(a,b\) cũng được đánh số từ \(0\).Bitaro muốn dùng máy để xác định xâu trên phiến đá. Vì máy rất dễ hỏng, số câu hỏi không được vượt quá \(1000\). Ngoài ra, giá trị lớn nhất của \(m\) trong các câu hỏi cần nhỏ nhất có thể.
Hãy viết chương trình dùng cỗ máy để xác định xâu trên phiến đá.
Bạn cần nộp một tệp ancient2.cpp, dùng chỉ thị #include để khai báo tệp ancient2.h, và cài đặt hàm:
std::string Solve(int N);
Hàm này được gọi đúng một lần cho mỗi bộ kiểm thử. Tham số N là độ dài của xâu \(S\) trên phiến đá. Hàm phải trả về chính xâu \(S\):
0 hoặc 1. Nếu không, chương trình bị chấm Wrong Answer [2].Chương trình có thể gọi hàm sau để đặt câu hỏi:
int Query(int m, std::vector<int> a, std::vector<int> b);
m, a, b là số nguyên và hai dãy được nhập vào máy. Hàm trả về số nguyên mà máy hiển thị sau khi đặt phiến đá lên máy và xử lý câu hỏi với các tham số này.
m phải nằm trong đoạn từ \(1\) đến \(1002\). Nếu không, chương trình bị chấm Wrong Answer [4].a và b phải bằng m. Nếu không, chương trình bị chấm Wrong Answer [5].a và b phải nằm trong đoạn từ \(0\) đến \(m-1\). Nếu không, chương trình bị chấm Wrong Answer [6].Query quá \(1000\) lần. Nếu vượt quá, chương trình bị chấm Wrong Answer [7].Bạn có thể cài đặt các hàm phụ và sử dụng biến toàn cục. Chương trình không được sử dụng đầu vào chuẩn, đầu ra chuẩn, hay giao tiếp với tệp khác bằng bất kỳ cách nào. Tuy nhiên, có thể ghi thông tin gỡ lỗi ra đầu ra lỗi chuẩn.
Biên dịch và chạy thử. Gói tệp hỗ trợ được đề gốc cung cấp qua trang kỳ thi chứa chương trình chấm mẫu và mã nguồn mẫu của chương trình cần nộp. Chương trình chấm mẫu là grader.cpp. Để thử chương trình, đặt grader.cpp, ancient2.cpp, ancient2.h trong cùng một thư mục và biên dịch bằng lệnh sau, hoặc chạy compile.sh trong gói hỗ trợ:
g++ -std=gnu++17 -O2 -o grader grader.cpp ancient2.cpp
Sau khi biên dịch thành công, tệp thực thi grader được tạo ra. Chương trình chấm thật khác chương trình chấm mẫu. Chương trình chấm mẫu chạy trong một tiến trình, đọc đầu vào chuẩn và ghi kết quả ra đầu ra chuẩn.
Chương trình chấm mẫu đọc dữ liệu từ đầu vào chuẩn theo định dạng:
N
S
Chương trình chấm mẫu ghi ra đầu ra chuẩn:
m trong các lần gọi Query, chẳng hạn Accepted: 22. Nếu trả lời đúng mà không gọi Query, ghi Accepted: 0.Wrong Answer [4].Nếu chương trình vi phạm nhiều loại lỗi Wrong Answer, chương trình chấm mẫu chỉ báo một loại.
0 hoặc 1.Trong mỗi bộ kiểm thử, chương trình chấm thật không thích nghi: đáp án đã được cố định ngay từ đầu.
Nếu chương trình bị chấm Wrong Answer ở bất kỳ bộ kiểm thử nào, điểm của toàn bộ bài là \(0\).
Nếu chương trình trả lời đúng ở tất cả các bộ kiểm thử, gọi \(M\) là giá trị lớn nhất của tham số m trong mọi lần gọi Query trên tất cả các bộ kiểm thử. Nếu chương trình trả lời đúng mà không gọi Query trong bất kỳ bộ kiểm thử nào, đặt \(M=0\).
Ở đây, \(\lfloor x\rfloor\) là số nguyên lớn nhất không vượt quá \(x\).
Ví dụ 1
Dữ liệu vào của trình chấm mẫu:
3
110
Giải thích
Bảng sau minh họa các lời gọi hàm tương ứng với đầu vào của chương trình chấm mẫu:
Lời gọi Solve |
Giá trị trả về của Solve |
Lời gọi Query |
Giá trị trả về của Query |
|---|---|---|---|
Solve(3) |
|||
Query(4, [3, 3, 2, 2], [2, 2, 1, 0]) |
3 |
||
Query(2, [0, 1], [1, 0]) |
0 |
||
Query(1, [0], [0]) |
0 |
||
Query(3, [1, 1, 1], [1, 1, 1]) |
1 |
||
"110" |
Giả sử xâu trên phiến đá là 110. Khi nhập \((m,a,b)=(4,[3,3,2,2],[2,2,1,0])\), máy hoạt động như sau:
1, nên đặt \(b_0=2\) vào vùng nhớ.1, nên đặt \(b_2=1\) vào vùng nhớ.0, nên đặt \(a_1=3\) vào vùng nhớ.Lưu ý rằng ví dụ này không thỏa mãn ràng buộc \(N=1000\). Trong các tệp mà đề gốc cung cấp qua trang kỳ thi, sample-02.txt thỏa mãn ràng buộc đó.
JOI Open Contest 2023 - Ancient Machine 2. Tác giả: Tomohito Hoshii. Đơn vị công bố: JCIOI (Ủy ban Nhật Bản về Olympic Tin học Quốc tế). Giấy phép: CC BY-SA 4.0.
Ta có một lưới hai chiều đủ lớn gồm các ô vuông, trải theo cả chiều ngang và chiều dọc. Chọn một ô làm gốc tọa độ. Ô \((x,y)\) là ô đến được khi đi từ gốc sang phải \(x\) ô và lên trên \(y\) ô. Đi sang trái \(a\) ô tương ứng với đi sang phải \(-a\) ô; đi xuống dưới \(a\) ô tương ứng với đi lên trên \(-a\) ô.
Tại thời điểm \(0\), các ô \((X_1,Y_1),(X_2,Y_2),\ldots,(X_N,Y_N)\) có màu đen, và tất cả các ô còn lại có màu trắng.
Với \(t=0,1,2,\ldots\), màu của các ô tại thời điểm \(t+1\) được xác định từ màu tại thời điểm \(t\) như sau:
Có \(Q\) truy vấn. Với truy vấn thứ \(j\) (\(1 \le j \le Q\)), hãy tìm số ô màu đen tại thời điểm \(T_j\).
Hãy viết chương trình trả lời các truy vấn khi biết màu của các ô tại thời điểm \(0\) và thông tin truy vấn.
Đọc từ đầu vào chuẩn theo định dạng:
N Q
X_1 Y_1
X_2 Y_2
...
X_N Y_N
T_1
T_2
...
T_Q
Ghi \(Q\) dòng ra đầu ra chuẩn. Dòng thứ \(j\) chứa số ô màu đen tại thời điểm \(T_j\).
Ví dụ 1
2 3
0 2
1 0
0
1
2
2
8
12
Hình dưới đây thể hiện màu các ô tại thời điểm \(0\). Có \(2\) ô màu đen, nên đáp án của truy vấn thứ nhất là \(2\).
Hình dưới đây thể hiện màu các ô tại thời điểm \(1\). Có \(8\) ô màu đen, nên đáp án của truy vấn thứ hai là \(8\).
Hình dưới đây thể hiện màu các ô tại thời điểm \(2\). Có \(12\) ô màu đen, nên đáp án của truy vấn thứ ba là \(12\).
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,6,7\).
Ví dụ 2
3 5
0 0
2 2
5 5
0
1
2
3
4
3
12
21
24
26
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,4,6,7\).
Ví dụ 3
4 10
-3 -3
3 3
-4 4
4 -4
0
1
2
3
4
5
6
7
8
9
4
16
32
48
56
56
55
56
60
64
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,6,7\).
JOI Open Contest 2023 - Cell Automaton. Tác giả: Akihito Yoneyama. Đơn vị công bố: JCIOI (Ủy ban Nhật Bản về Olympic Tin học Quốc tế). Giấy phép: CC BY-SA 4.0.
Vương quốc JOI là một vương quốc bí ẩn có lãnh thổ rộng vô tận. Vua JOI-kun định dành một phần lãnh thổ để làm khu vườn của mình.
Lãnh thổ được xem như một lưới hai chiều đủ lớn gồm các ô vuông, trải theo cả chiều ngang và chiều dọc. Chọn một ô làm gốc tọa độ. Ô \((x,y)\) là ô đến được khi đi từ gốc sang phải \(x\) ô và lên trên \(y\) ô. Đi sang trái \(a\) ô tương ứng với đi sang phải \(-a\) ô; đi xuống dưới \(a\) ô tương ứng với đi lên trên \(-a\) ô.
Trên lãnh thổ có các tác phẩm nghệ thuật, được chia thành hai loại A và B theo cách bố trí:
Một ô có thể chứa nhiều tác phẩm thuộc các kiểu khác nhau.
JOI-kun sẽ chọn một vùng hình chữ nhật trên lưới làm vườn. Cụ thể, ông chọn bốn số nguyên \(a,b,c,d\); khu vườn gồm các ô \((x,y)\) với \(x,y\) nguyên thỏa mãn \(a \le x \le b\), \(c \le y \le d\).
Vì thích ngắm nhiều kiểu tác phẩm, JOI-kun muốn khu vườn chứa ít nhất một tác phẩm của mỗi kiểu trong \(N+M\) kiểu. Tuy nhiên, người dân sẽ tức giận nếu khu vườn quá lớn, nên ông muốn số ô trong vườn nhỏ nhất có thể mà vẫn thỏa mãn điều kiện trên.
Hãy viết chương trình tính số ô nhỏ nhất trong khu vườn của JOI-kun khi biết thông tin về các tác phẩm.
Đọc từ đầu vào chuẩn theo định dạng:
N M D
P_1 Q_1
P_2 Q_2
...
P_N Q_N
R_1 S_1
R_2 S_2
...
R_M S_M
Ghi một dòng ra đầu ra chuẩn, chứa số ô nhỏ nhất có thể trong khu vườn của JOI-kun.
Ví dụ 1
2 1 5
1 4
2 2
0 0
8
Hình dưới đây biểu diễn các ô \((x,y)\) với \(x,y\) nguyên thỏa mãn \(0 \le x < 10\), \(0 \le y < 10\) trong lãnh thổ Vương quốc JOI.
Hình tròn và hình thoi lần lượt biểu diễn tác phẩm loại A và B. Số bên trong hình cho biết kiểu tác phẩm. Nếu chọn \(a=1,b=2,c=2,d=5\), khu vườn là vùng hình chữ nhật tô đen trong hình. Khi đó, vườn chứa ít nhất một tác phẩm của mỗi kiểu trong ba kiểu và có \(8\) ô. Không có khu vườn nào thỏa mãn điều kiện mà có ít ô hơn, nên xuất \(8\).
Ví dụ này thỏa mãn ràng buộc của tất cả các nhóm.
Ví dụ 2
3 4 100
20 26
81 56
20 3
58 71
74 82
95 61
95 61
2840
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,4,5,6\).
Ví dụ 3
5 7 5000
1046 365
4122 1166
4009 2896
1815 4065
4372 1651
2382 123
1475 836
3313 4005
2579 568
4300 4867
1050 3214
3589 4653
10543092
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,5,6\).
JOI Open Contest 2023 - Garden. Tác giả: Yuto Watanabe. Đơn vị công bố: JCIOI (Ủy ban Nhật Bản về Olympic Tin học Quốc tế). Giấy phép: CC BY-SA 4.0.