| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2023 - Belt Conveyor | 100 (p) | 5.0s | 1G |
| 2 | JOI 2023 - Council | 100 (p) | 3.0s | 1G |
| 3 | JOI 2023 - Mizuyokan 2 | 100 (p) | 3.0s | 1G |
Trong nhà máy của công ty JOI có \(N\) bàn, đánh số từ \(0\) đến \(N-1\), và \(N-1\) băng chuyền, đánh số từ \(0\) đến \(N-2\). Băng chuyền \(i\) nối bàn \(A_i\) với bàn \(B_i\) và vận chuyển theo đúng một trong hai hướng, nhưng không thể quan sát hướng vận chuyển. Nếu bỏ qua hướng, có thể đi giữa hai bàn bất kỳ qua các băng chuyền.
IOI là giám đốc nhà máy nhưng không nhớ hướng ban đầu của các băng chuyền. Để xác định chúng, IOI có thể thực hiện thao tác sau:
Hãy xác định hướng ban đầu của tất cả băng chuyền bằng không quá \(30\) thao tác.
Đây là bài tương tác qua thư viện. Viết tệp conveyor.cpp, bao gồm conveyor.h, và cài đặt hàm:
void Solve(int N, std::vector<int> A, std::vector<int> B);
Hàm được gọi đúng một lần. N là số bàn; A, B có độ dài \(N-1\), mô tả hai đầu của từng băng chuyền. Chương trình có thể gọi hai hàm do trình chấm cung cấp:
std::vector<int> Query(std::vector<int> x, std::vector<int> y);
void Answer(std::vector<int> a);
Query(x,y) thực hiện một thao tác:
x có độ dài \(N-1\); \(x_i=1\) nghĩa là đảo hướng băng chuyền \(i\), \(x_i=0\) nghĩa là không đảo.y có độ dài \(N\); \(y_j=1\) nghĩa là đặt một sản phẩm lên bàn \(j\), \(y_j=0\) nghĩa là không đặt.z có độ dài \(N\). Sau bước \(3\), \(z_j=1\) nếu bàn \(j\) có ít nhất một sản phẩm, ngược lại \(z_j=0\).x, y, z đều là \(0\) hoặc \(1\). Được gọi Query nhiều nhất \(30\) lần.Gọi Answer(a) đúng một lần để trả lời. a có độ dài \(N-1\), mỗi phần tử bằng \(0\) hoặc \(1\): \(a_i=0\) nếu hướng ban đầu là từ \(A_i\) đến \(B_i\), \(a_i=1\) nếu hướng ban đầu là từ \(B_i\) đến \(A_i\).
Các lỗi được báo như sau:
| Thông báo | Nguyên nhân |
|---|---|
Wrong Answer [1] |
Độ dài x không bằng \(N-1\). |
Wrong Answer [2] |
Có phần tử của x khác \(0\) và \(1\). |
Wrong Answer [3] |
Độ dài y không bằng \(N\). |
Wrong Answer [4] |
Có phần tử của y khác \(0\) và \(1\). |
Wrong Answer [5] |
Gọi Query quá \(30\) lần. |
Wrong Answer [6] |
Độ dài a không bằng \(N-1\). |
Wrong Answer [7] |
Có phần tử của a khác \(0\) và \(1\). |
Wrong Answer [8] |
Có hướng trả lời không đúng. |
Wrong Answer [9] |
Gọi Answer nhiều hơn một lần. |
Wrong Answer [10] |
Solve kết thúc mà chưa gọi Answer. |
Bạn được phép định nghĩa các hàm khác và dùng biến toàn cục. Chương trình không được đọc hoặc ghi đầu vào chuẩn, đầu ra chuẩn hay bất kỳ tệp nào bằng bất kỳ phương thức nào; có thể ghi thông tin gỡ lỗi ra đầu ra lỗi chuẩn.
Trình chấm thật có thể thích nghi trên một số test: hướng các băng chuyền có thể chưa được cố định từ đầu, nhưng luôn tồn tại ít nhất một cách gán hướng phù hợp với tất cả câu trả lời của trình chấm cho đến thời điểm đó.
Bộ tệp công khai gồm conveyor.h, grader.cpp, conveyor.cpp, compile.sh và ba tệp sample-01.txt, sample-02.txt, sample-03.txt. Có thể biên dịch bằng lệnh sau (hoặc chạy compile.sh):
g++ -std=gnu++17 -O2 -o grader grader.cpp conveyor.cpp
Trình chấm mẫu và chương trình của bạn chạy trong cùng một tiến trình; trình chấm thật sử dụng các tiến trình khác nhau.
Đầu vào của trình chấm mẫu có dạng:
N
A_0 A_1 ... A_(N-2)
B_0 B_1 ... B_(N-2)
C_0 C_1 ... C_(N-2)
\(C_i=0\) nghĩa là băng chuyền \(i\) ban đầu hướng từ \(A_i\) đến \(B_i\); \(C_i=1\) nghĩa là hướng ngược lại. Các giá trị \(C_i\) chỉ được trình chấm mẫu đọc, không được truyền vào Solve.
Nếu chấp nhận câu trả lời, trình chấm mẫu in số lần gọi Query, chẳng hạn Accepted: 22. Nếu có lỗi, nó in thông báo tương ứng, chẳng hạn Wrong Answer [4]. Khi có nhiều lỗi, chỉ một lỗi được báo.
Nếu có nhiều băng chuyền đi ra từ một bàn, trình chấm mẫu chọn ngẫu nhiên đều một trong số đó. Bộ sinh số giả ngẫu nhiên là std::mt19937, mặc định có seed \(0\), nên cùng một chương trình cho cùng kết quả khi chạy lại với cùng đầu vào. Có thể truyền seed nguyên làm đối số dòng lệnh đầu tiên, chẳng hạn ./grader 2023.
Bài nộp nhận dữ liệu qua các đối số của những hàm được mô tả ở trên, không đọc đầu vào chuẩn.
Bài nộp không ghi đầu ra chuẩn. Kết quả được gửi qua các hàm gọi lại được mô tả ở trên.
Query không vượt quá \(30\).Ví dụ 1
Dữ liệu vào của trình chấm mẫu:
3
0 2
2 1
1 0
Trao đổi lời gọi
| Lời gọi | Giá trị trả về |
|---|---|
Solve(3, [0, 2], [2, 1]) |
|
Query([0, 0], [0, 0, 1]) |
[1, 0, 0] |
Query([1, 0], [1, 0, 1]) |
[0, 1, 1] |
Query([1, 1], [0, 0, 1]) |
[0, 0, 1] |
Query([0, 1], [1, 1, 1]) |
[1, 0, 1] |
Answer([1, 0]) |
Giải thích
Trong lần gọi Query thứ nhất, sản phẩm trên bàn \(2\) có thể đi đến bàn \(0\) hoặc bàn \(1\); do đó trình chấm cũng có thể trả về [0, 1, 0].
Trong lần gọi thứ hai, sản phẩm đặt trên bàn \(0\) đi qua băng chuyền \(0\) đến bàn \(2\) rồi dừng, không tiếp tục qua băng chuyền \(1\) đến bàn \(1\).
Ví dụ này không thỏa mãn ràng buộc của bất kỳ nhóm nào.
Ví dụ 2
Dữ liệu vào của trình chấm mẫu:
2
0
1
0
Giải thích
Đây là dữ liệu từ bộ trình chấm mẫu công khai, thỏa mãn ràng buộc nhóm \(1\).
Ví dụ 3
Dữ liệu vào của trình chấm mẫu:
30
17 25 16 7 18 20 7 20 3 4 2 6 8 26 6 11 29 5 28 18 17 22 7 10 2 16 23 16 15
9 21 0 11 1 2 2 14 17 7 28 19 6 16 13 12 3 7 18 25 24 23 27 13 17 20 16 8 20
1 1 0 0 1 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 0 1 1 1
Giải thích
Đây là dữ liệu từ bộ trình chấm mẫu công khai, thỏa mãn ràng buộc nhóm \(2\).
JOI 2022/2023 Spring Training, Contest 2, 20/03/2023. Đề gốc của JCIOI; bản dịch tiếng Việt theo giấy phép CC BY-SA 4.0.
Hội đồng thành phố JOI có \(N\) nghị viên, đánh số từ \(1\) đến \(N\). Hội đồng sắp biểu quyết \(M\) dự thảo điều lệ, đánh số từ \(1\) đến \(M\). Nếu \(A_{i,j}=1\), nghị viên \(i\) dự định bỏ phiếu tán thành dự thảo \(j\); nếu \(A_{i,j}=0\), người đó dự định bỏ phiếu phản đối.
Phiên họp diễn ra như sau:
Thị trưởng K muốn có càng nhiều điều lệ được thông qua càng tốt và đã thu thập dự định bỏ phiếu của mọi nghị viên. Với từng nghị viên, hãy tính số dự thảo được thông qua lớn nhất có thể nếu người đó được chọn làm chủ tịch, bằng cách lựa chọn phó chủ tịch phù hợp.
Đọc từ đầu vào chuẩn:
N M
A_1,1 A_1,2 ... A_1,M
A_2,1 A_2,2 ... A_2,M
...
A_N,1 A_N,2 ... A_N,M
In \(N\) dòng ra đầu ra chuẩn. Dòng \(i\) chứa số dự thảo được thông qua lớn nhất có thể nếu nghị viên \(i\) được chọn làm chủ tịch.
Ví dụ 1
3 3
1 0 0
1 1 0
1 1 1
3
3
2
Ví dụ thỏa mãn các nhóm \(1,2,4,5,6,7\).
Ví dụ 2
4 12
1 1 1 0 1 1 0 1 0 1 1 0
1 1 0 1 1 0 1 1 1 1 1 0
0 0 1 1 1 0 0 0 0 0 1 1
1 0 0 0 1 1 1 1 1 0 0 0
5
4
6
6
Ví dụ thỏa mãn các nhóm \(1,2,5,6,7\).
Ví dụ 3
16 4
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1
3
3
3
2
3
2
2
1
3
2
2
1
2
1
1
0
Ví dụ thỏa mãn các nhóm \(1,2,4,5,6,7\).
Ví dụ 4
4 2
1 0
0 1
1 1
1 1
2
2
1
1
Ví dụ thỏa mãn tất cả các nhóm.
JOI 2022/2023 Spring Training, Contest 2, 20/03/2023. Đề gốc của JCIOI; bản dịch tiếng Việt theo giấy phép CC BY-SA 4.0.
Mizuyokan là một loại bánh ngọt Nhật Bản, được làm bằng cách đổ nhân chủ yếu từ đậu đỏ vào khuôn rồi làm đông bằng thạch agar.
JOI có một máy làm mizuyokan hình hộp chữ nhật dài theo phương ngang. Trên bánh có \(N-1\) đường cắt theo phương dọc. Chiều dài bánh và vị trí các đường cắt được xác định bởi \(N\) tham số \(d_1,d_2,\ldots,d_N\): tổng chiều dài là \(d_1+d_2+\cdots+d_N\), và khoảng cách giữa đường cắt thứ \(i-1\) và thứ \(i\) từ trái sang phải là \(d_i\). Quy ước đầu trái là đường cắt thứ \(0\), đầu phải là đường cắt thứ \(N\). Ban đầu, \(d_i=L_i\).
JOI dự định tổ chức \(Q\) buổi tiệc trà theo thứ tự. Buổi thứ \(j\) được mô tả bằng bốn số nguyên \(X_j,Y_j,A_j,B_j\) và diễn ra như sau:
Dãy zíc zắc là dãy có các phần tử luân phiên tăng và giảm nghiêm ngặt. Chẳng hạn, \((2,9,2,7)\), \((7,1,9,4,6)\), \((5)\) và \((2,1)\) là các dãy zíc zắc; còn \((1,2,3)\), \((7,1,4,4,6)\) và \((2,2)\) thì không. Chính xác hơn, dãy \((x_1,x_2,\ldots,x_m)\) là zíc zắc nếu thỏa mãn ít nhất một trong hai điều kiện:
Để mời được nhiều bạn nhất, JOI muốn tối đa hóa số miếng thu được ở bước \(3\) của mỗi buổi tiệc. Cho các tham số ban đầu và kế hoạch các buổi tiệc, hãy tính số miếng lớn nhất cho từng buổi. Với các ràng buộc của bài, luôn tồn tại cách chia thỏa mãn điều kiện.
Đọc từ đầu vào chuẩn:
N
L_1 L_2 ... L_N
Q
X_1 Y_1 A_1 B_1
X_2 Y_2 A_2 B_2
...
X_Q Y_Q A_Q B_Q
In \(Q\) dòng ra đầu ra chuẩn. Dòng \(j\) chứa số miếng lớn nhất có thể thu được bằng cách chia hợp lệ trong buổi tiệc thứ \(j\).
Ví dụ 1
6
5 6 8 7 4 9
1
6 9 0 5
3
Các tham số trong buổi tiệc thứ nhất là \((5,6,8,7,4,9)\). Phần bánh từ đường cắt thứ \(0\) đến thứ \(5\) được dùng cho buổi tiệc, như hình 1.
Hình 2 biểu diễn ba cách chia, lần lượt từ trên xuống là cách 1, 2 và 3.
Cách 1 cho các độ dài \((5,14,7,4)\), không phải dãy zíc zắc nên không hợp lệ. Cách 2 cho \((11,8,11)\), là dãy zíc zắc nên hợp lệ. Cách 3 giữ nguyên một miếng dài \(30\), cũng hợp lệ.
Cách 2 tạo được \(3\) miếng và không thể chia hợp lệ thành ít nhất \(4\) miếng, nên kết quả là \(3\). Ví dụ thỏa mãn tất cả các nhóm.
Ví dụ 2
4
6 2 3 6
3
3 2 1 3
4 5 1 4
1 1 0 4
1
2
3
Ví dụ thỏa mãn các nhóm \(1,2,3,5,6\).
JOI 2022/2023 Spring Training, Contest 2, 20/03/2023. Đề gốc của JCIOI; bản dịch tiếng Việt theo giấy phép CC BY-SA 4.0.