| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2025 - Circuit 2 | 100 (p) | 2.0s | 1G |
| 2 | JOI 2025 - Migration Plan | 100 (p) | 7.5s | 2G |
| 3 | JOI 2025 - Uiro | 100 (p) | 5.0s | 1G |
JOI-kun đang chơi với một bộ mạch điện tử gồm \(N\) linh kiện AND, \(N\) linh kiện OR và một bảng mạch. Bảng mạch có \(2N+1\) công tắc và \(N\) khe cắm linh kiện; mỗi khe có thể được sử dụng bằng cách đặt vào đó một linh kiện AND hoặc OR. Bảng mạch cho ra giá trị \(0\) hoặc \(1\), tùy theo các linh kiện được đặt và trạng thái của các công tắc.
Ví dụ, khi \(N=3\), \(U_0=1\), \(V_0=2\), \(U_1=3\), \(V_1=4\), \(U_2=5\), \(V_2=6\), các khe cắm \(0,1\) chứa linh kiện AND và khe cắm \(2\) chứa linh kiện OR, bảng mạch được biểu diễn như hình sau.
JOI-kun định đặt linh kiện AND vào tất cả các khe cắm, nhưng phát hiện có nhiều nhất \(R\) linh kiện OR bị đặt lẫn vào. Vì linh kiện AND và OR có hình dạng giống nhau, cần dùng bảng mạch để phân biệt chúng. Bạn được hỏi JOI-kun nhiều nhất \(1000\) truy vấn theo dạng sau:
Cho cấu trúc kết nối và cận trên của số linh kiện OR, hãy xác định tất cả các khe cắm chứa linh kiện OR bằng nhiều nhất \(1000\) truy vấn.
Bạn cần nộp một tệp có tên circuit.cpp. Tệp này phải dùng chỉ thị #include để nạp circuit.h và cài đặt hàm sau:
std::string solve(int N, int R, std::vector<int> U, std::vector<int> V)
N là số khe cắm linh kiện; R là cận trên của số linh kiện OR.U và V là hai mảng độ dài \(N\). Với \(0\le i\le N-1\), U[i] và V[i] là số hiệu \(U_i,V_i\) của hai công tắc nối với khe cắm \(i\).& và |. Với mỗi \(i=0,1,\ldots,N-1\), t[i] phải là & nếu khe cắm \(i\) chứa linh kiện AND và là | nếu chứa linh kiện OR.Wrong Answer [1].& và |, chương trình bị chấm Wrong Answer [2].Wrong Answer [3].Chương trình của bạn có thể gọi hàm sau:
int query(std::string s)
s phải là xâu độ dài \(2N+1\) chỉ gồm 0 và 1. Với mỗi \(j=0,1,\ldots,2N\), s[j] bằng 0 nghĩa là đặt công tắc \(j\) ở trạng thái OFF, còn s[j] bằng 1 nghĩa là đặt ở trạng thái ON.s khác \(2N+1\), chương trình bị chấm Wrong Answer [4].s chứa ký tự khác 0 và 1, chương trình bị chấm Wrong Answer [5].Wrong Answer [6].s.Bạn được cài đặt thêm các hàm phụ và khai báo biến toàn cục để dùng nội bộ. Chương trình không được tương tác với đầu vào chuẩn, đầu ra chuẩn hoặc bất kỳ tệp nào khác. Tuy nhiên, có thể ghi thông tin gỡ lỗi ra đầu ra lỗi chuẩn.
Gói tệp được cung cấp trên trang cuộc thi chứa chương trình chấm mẫu và một tệp mã nguồn mẫu cho phần cần cài đặt. Chương trình chấm mẫu là tệp grader.cpp. Để chạy thử, đặt grader.cpp, circuit.cpp và circuit.h trong cùng một thư mục rồi dùng lệnh:
g++ -std=gnu++20 -O2 -o grader grader.cpp circuit.cpp
Bạn cũng có thể chạy tệp compile.sh có trong gói:
./compile.sh
Nếu biên dịch thành công, tệp thực thi grader sẽ được tạo. Chương trình chấm thực 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 dữ liệu từ đầu vào chuẩn và ghi kết quả ra đầu ra chuẩn.
Gọi \(T\) là xâu độ dài \(N\) mà hàm solve cần trả về. Chương trình chấm mẫu đọc dữ liệu theo dạng:
N R
U_0 V_0
U_1 V_1
...
U_{N-1} V_{N-1}
T
query, chẳng hạn Accepted: 22.Wrong Answer [4].Chương trình chấm mẫu kết thúc ngay khi gặp một điều kiện sai. Nếu có nhiều điều kiện sai, chỉ một loại lỗi được hiển thị.
Chương trình chấm thực tế không thích nghi: đáp án đã được cố định từ trước khi bắt đầu tương tác.
Dưới đây là dữ liệu vào của chương trình chấm mẫu và các lời gọi hàm tương ứng.
Ví dụ 1
Dữ liệu vào của trình chấm mẫu:
1 1
1 2
|
Tương tác
Chương trình chấm gọi solve(1, 1, [1], [2]).
| Lời gọi | Giá trị trả về |
|---|---|
query("010") |
1 |
query("011") |
1 |
query("111") |
0 |
Cuối cùng, solve trả về xâu |.
Giải thích
Trong lần gọi query đầu tiên:
Ví dụ này thỏa mãn ràng buộc của tất cả các nhóm.
Ví dụ 2
Dữ liệu vào của trình chấm mẫu:
3 3
1 2
3 4
5 6
&&|
Tương tác
Chương trình chấm gọi solve(3, 3, [1, 3, 5], [2, 4, 6]).
| Lời gọi | Giá trị trả về |
|---|---|
query("0001001") |
0 |
query("0001110") |
1 |
query("0000011") |
0 |
Cuối cùng, solve trả về xâu &&|.
Giải thích
Hình trong đề bài biểu diễn bảng mạch của ví dụ này.
Ví dụ này thỏa mãn ràng buộc của các nhóm \(3,6,7,8,9\).
Trong các tệp được cung cấp trên trang cuộc thi, sample-01-in.txt tương ứng với ví dụ \(1\), sample-02-in.txt tương ứng với ví dụ \(2\). Ngoài ra, sample-03-in.txt thỏa mãn ràng buộc của các nhóm \(3,4,5,8,9\) và sample-04-in.txt thỏa mãn ràng buộc của các nhóm \(3,6,7,8,9\).
Bài Circuit 2, JOI 2024/2025, kỳ thi thứ tư của vòng tuyển chọn mùa xuân, do Ủy ban Olympic Tin học Nhật Bản (Japanese Committee for the International Olympiad in Informatics, JCIOI) công bố theo giấy phép CC BY-SA 4.0. Đây là bản dịch tiếng Việt; hình minh họa được giữ lại từ đề chính thức.
Vương quốc JOI có \(N\) thành phố được đánh số từ \(1\) đến \(N\), nối với nhau bởi \(N-1\) con đường một chiều. Với mỗi \(i=2,3,\ldots,N\), có một con đường đi từ thành phố \(i\) đến thành phố \(P_i\), trong đó \(1\le P_i<i\).
Mỗi thành phố có một mức độ nguy hiểm. Thủ đô, tức thành phố \(1\), có mức độ nguy hiểm bằng \(0\). Với thành phố \(i\) (\(2\le i\le N\)), mức độ nguy hiểm là số con đường trên đường đi từ thành phố \(i\) đến thành phố \(1\). Cấu trúc của vương quốc bảo đảm rằng đường đi này là duy nhất.
Hiện có \(K_i\) con hải ly sống tại thành phố \(i\) (\(1\le i\le N\)). Tổng thống Bitaro lập một kế hoạch di cư kéo dài \(Q\) ngày. Vào ngày thứ \(j\) (\(1\le j\le Q\)), một trong ba sự kiện sau xảy ra:
Là cấp dưới của Bitaro, bạn nhận ra có thể tính kết quả của mọi lần khảo sát chỉ từ thông tin kế hoạch mà không cần đến tận nơi. Cho cấu trúc vương quốc, số hải ly ban đầu tại mỗi thành phố và các sự kiện trong kế hoạch, hãy tính kết quả của từng lần khảo sát.
1 X_j Y_j: xảy ra sự kiện di dời từ mức độ nguy hiểm \(X_j\) đến mức độ nguy hiểm \(Y_j\) theo mô tả trên.2 A_j L_j: xảy ra sự kiện nhập cư, số hải ly ở thành phố \(A_j\) tăng thêm \(L_j\).3 B_j: xảy ra sự kiện khảo sát tại thành phố \(B_j\).Các số trên cùng một dòng được ngăn cách bởi dấu cách.
Với mỗi ngày \(j\) có \(T_j=3\), in số hải ly ở thành phố \(B_j\) tại thời điểm đó trên một dòng, theo thứ tự các sự kiện.
Gọi \(D\) là mức độ nguy hiểm lớn nhất trong các thành phố.
Ví dụ 1
4
1 1 2
1 3 4 3
6
3 1
1 1 0
3 1
3 2
1 2 1
3 2
1
8
0
3
Ban đầu, các thành phố \(1,2,3,4\) có lần lượt \(1,3,4,3\) con hải ly; mức độ nguy hiểm của chúng lần lượt là \(0,1,1,2\).
Ví dụ này thỏa mãn ràng buộc của các nhóm \(2,3,4,5,6,7\).
Ví dụ 2
3
1 1
3 1 4
11
2 2 5
1 2 0
3 1
1 1 0
3 1
3 2
2 3 4
3 3
1 1 0
3 3
3 1
3
13
0
4
0
17
Ban đầu, các thành phố \(1,2,3\) có lần lượt \(3,1,4\) con hải ly; mức độ nguy hiểm của chúng lần lượt là \(0,1,1\).
Các sự kiện tiếp theo diễn ra tương tự nên không trình bày chi tiết.
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,3,7\).
Ví dụ 3
7
1 2 1 3 3 2
5 2 8 9 4 0 5
10
1 3 1
2 4 10
3 2
1 6 3
1 2 0
3 1
3 4
2 5 6
3 5
3 3
6
18
19
6
0
Ví dụ này thỏa mãn ràng buộc của các nhóm \(2,3,5,7\).
Bài Migration Plan, JOI 2024/2025, kỳ thi thứ tư của vòng tuyển chọn mùa xuân, do Ủy ban Olympic Tin học Nhật Bản (Japanese Committee for the International Olympiad in Informatics, JCIOI) công bố theo giấy phép CC BY-SA 4.0. Đây là bản dịch tiếng Việt của đề chính thức.
Aoi có \(N\) lá bài được đánh số từ \(1\) đến \(N\). Trên mỗi lá bài ghi một số nguyên dương; số trên lá bài thứ \(i\) (\(1\le i\le N\)) là \(A_i\).
Aoi sẽ chơi \(Q\) ván bằng các lá bài và một chiếc bảng. Ván thứ \(j\) (\(1\le j\le Q\)) gồm các bước sau:
Cho thông tin về các lá bài và các ván chơi, hãy tìm số miếng uiro nhiều nhất Aoi có thể ăn trong mỗi ván.
Các số trên cùng một dòng được ngăn cách bởi dấu cách.
In \(Q\) dòng. Dòng thứ \(j\) (\(1\le j\le Q\)) chứa số miếng uiro nhiều nhất Aoi có thể ăn trong ván thứ \(j\).
Ví dụ 1
5
3 4 7 2 8
2
1 3
4 4
1
0
Trong ván thứ nhất, Aoi có thể thực hiện như sau:
Aoi ăn được \(1\) miếng uiro. Có thể chứng minh rằng không thể ăn quá \(1\) miếng trong ván này, nên in \(1\).
Trong ván thứ hai, Aoi có thể thực hiện như sau:
Aoi ăn được \(0\) miếng uiro. Không thể ăn quá \(0\) miếng trong ván này, nên in \(0\).
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,3,4,6,7\).
Ví dụ 2
14
1 2 2 1 2 1 1 2 1 2 2 1 1 1
5
1 2
1 14
5 11
3 12
4 7
0
8
4
6
2
Trong ván thứ nhất, Aoi có thể thực hiện như sau:
Aoi ăn được \(0\) miếng uiro. Không thể ăn quá \(0\) miếng trong ván này, nên in \(0\).
Ví dụ này thỏa mãn ràng buộc của tất cả các nhóm.
Ví dụ 3
8
16 23 45 76 43 97 12 43
7
1 8
3 7
2 7
4 5
5 8
2 6
3 5
3
2
2
1
2
2
1
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,3,4,7\).
Bài Uiro, JOI 2024/2025, kỳ thi thứ tư của vòng tuyển chọn mùa xuân, do Ủy ban Olympic Tin học Nhật Bản (Japanese Committee for the International Olympiad in Informatics, JCIOI) công bố theo giấy phép CC BY-SA 4.0. Đây là bản dịch tiếng Việt của đề chính thức.