| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2024 - Escape Route 2 | 100 (p) | 3.0s | 1G |
| 2 | JOI 2024 - Island Hopping | 100 (p) | 2.0s | 1G |
| 3 | JOI 2024 - Table Tennis | 100 (p) | 1.0s | 1G |
Vương quốc IOI gồm \(N\) thành phố nằm trên một đường từ tây sang đông, được đánh số từ \(1\) đến \(N\) theo thứ tự từ phía tây.
Ở vương quốc IOI, đơn vị thời gian là Byou và một ngày dài \(T\) Byou. Thời điểm đã trôi qua \(x\) Byou kể từ đầu ngày, với \(0 \le x < T\), được gọi là thời điểm \(x\). Vì vậy, sau một Byou kể từ thời điểm \(T-1\) của một ngày là thời điểm \(0\) của ngày tiếp theo.
JOI là một tổ chức bí mật hoạt động trong vương quốc IOI. Các thành viên phải tránh những trạm kiểm soát của vương quốc, nên khi di chuyển giữa các thành phố, họ chỉ được sử dụng các chuyến bay của hãng hàng không JOY.
Hãng JOY khai thác \(M_i\) chuyến bay khởi hành từ thành phố \(i\) \((1 \le i \le N-1)\). Chuyến bay thứ \(j\) \((1 \le j \le M_i)\) khởi hành từ thành phố \(i\) vào thời điểm \(A_{i,j}\) mỗi ngày và đến thành phố \(i+1\) vào thời điểm \(B_{i,j}\) trong cùng ngày, với \(A_{i,j}<B_{i,j}\). Việc nối chuyến rất thuận tiện: một người có thể khởi hành đúng lúc vừa đến một thành phố. Người đó cũng có thể chờ qua đêm tại sân bay của bất kỳ thành phố nào.
Tổ chức có \(Q\) thành viên, được đánh số từ \(1\) đến \(Q\). Thành viên \(k\) có căn cứ hoạt động ở thành phố \(L_k\) và nơi sinh sống ở thành phố \(R_k\). Người đó muốn biết thời gian ngắn nhất tính từ lúc rời thành phố \(L_k\) đến lúc tới thành phố \(R_k\), khi được tự chọn thời điểm khởi hành và các chuyến bay sẽ sử dụng.
Cho thông tin về các chuyến bay và các thành viên, hãy tính thời gian ngắn nhất cho từng thành viên.
Đọc từ đầu vào chuẩn theo định dạng:
N T
M_1
A_{1,1} B_{1,1}
...
A_{1,M_1} B_{1,M_1}
M_2
A_{2,1} B_{2,1}
...
A_{2,M_2} B_{2,M_2}
...
M_{N-1}
A_{N-1,1} B_{N-1,1}
...
A_{N-1,M_{N-1}} B_{N-1,M_{N-1}}
Q
L_1 R_1
...
L_Q R_Q
In \(Q\) dòng. Dòng thứ \(k\) chứa thời gian ngắn nhất để thành viên \(k\) đi từ thành phố \(L_k\) đến thành phố \(R_k\), tính bằng Byou nhưng không in tên đơn vị.
Ví dụ 1
4 10000
1
100 300
2
200 400
300 600
1
500 600
3
1 3
2 4
1 4
500
400
10500
Gọi ngày thành viên \(k\) rời thành phố \(L_k\) là ngày thứ nhất.
Thành viên \(1\) có thể đi từ thành phố \(1\) đến thành phố \(3\) trong \(500\) Byou:
Không có cách đi nhanh hơn, nên dòng đầu tiên là 500.
Thành viên \(2\) có thể đi từ thành phố \(2\) đến thành phố \(4\) trong \(400\) Byou:
Không có cách đi nhanh hơn, nên dòng thứ hai là 400.
Thành viên \(3\) có thể đi từ thành phố \(1\) đến thành phố \(4\) trong \(10\,500\) Byou:
Không có cách đi nhanh hơn, nên dòng thứ ba là 10500.
Ví dụ này thỏa mãn các nhóm \(2,4,5,6\).
Ví dụ 2
6 10000
1
100 300
1
400 700
1
500 600
1
300 900
1
200 800
1
1 6
30700
Ví dụ này thỏa mãn tất cả các nhóm.
JOI 2023/2024, kỳ thi tuyển chọn mùa xuân, ngày thi thứ tư (24/03/2024). Đề của Ủy ban Olympic Tin học Nhật Bản (JCIOI). Bản dịch tiếng Việt theo giấy phép CC BY-SA 4.0.
Vương quốc JOI có \(N\) hòn đảo, được đánh số từ \(1\) đến \(N\), và \(N-1\) tuyến đường biển, được đánh số từ \(1\) đến \(N-1\). Tuyến thứ \(j\) nối đảo \(A_j\) với đảo \(B_j\) theo cả hai chiều. Có thể đi từ bất kỳ đảo nào đến bất kỳ đảo nào khác bằng cách sử dụng một số tuyến đường biển.
Aoi đang lên kế hoạch du lịch ở vương quốc JOI nhưng không biết những tuyến đường biển này. Cô sẽ hỏi Bitaro, một cư dân của vương quốc, theo cách sau:
Aoi muốn xác định tất cả các tuyến đường biển nhưng chỉ được hỏi Bitaro tối đa \(L\) lần. Cho số đảo và giới hạn số câu hỏi, hãy cài đặt chiến lược giúp Aoi tìm được tất cả các tuyến đường biển.
Nộp một tệp duy nhất tên island.cpp. Tệp này phải có chỉ thị #include "island.h" và cài đặt hàm:
void solve(int N, int L);
Hàm được gọi đúng một lần cho mỗi bộ dữ liệu. N là số đảo, còn L là số câu hỏi tối đa được phép hỏi.
Trong island.cpp, có thể gọi hai hàm sau do chương trình chấm cung cấp:
int query(int v, int k);
void answer(int x, int y);
Hàm query(v, k) đặt một câu hỏi cho Bitaro và trả về số hiệu của đảo gần đảo v thứ k, theo đúng định nghĩa trong đề.
Wrong Answer [1].Wrong Answer [2].query quá \(L\) lần; nếu vượt quá, nhận Wrong Answer [3].Hàm answer(x, y) báo rằng có một tuyến đường biển nối đảo x và đảo y.
x và y phải thuộc đoạn từ \(1\) đến \(N\); nếu không, nhận Wrong Answer [4].Wrong Answer [5].Wrong Answer [6].answer đúng \(N-1\) lần. Nếu khi solve kết thúc mà số lần gọi không bằng \(N-1\), nhận Wrong Answer [7].Có thể cài đặt các hàm phụ và sử dụng biến toàn cục. Chương trình nộp không được đọc hoặc ghi đầu vào chuẩn, đầu ra chuẩn, hay giao tiếp với bất kỳ tệp nào bằng bất kỳ cách nào. Có thể ghi thông tin gỡ lỗi ra đầu ra lỗi chuẩn.
Chương trình chấm chính thức không thích nghi trong mọi bộ dữ liệu: các tuyến đường biển được cố định từ trước, không thay đổi theo những câu hỏi đã đặt.
Gói tệp dành cho thí sinh chứa chương trình chấm mẫu grader.cpp, tệp mẫu island.cpp, tệp tiêu đề island.h và compile.sh. Đặt grader.cpp, island.cpp, island.h trong cùng một thư mục rồi biên dịch bằng lệnh dưới đây, hoặc chạy compile.sh:
g++ -std=gnu++20 -O2 -o grader grader.cpp island.cpp
Nếu biên dịch thành công, tệp thực thi grader được tạo ra. Chương trình chấm chính thức 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; đây không phải quyền sử dụng đầu vào/đầu ra chuẩn của mã thí sinh.
N L
A_1 B_1
A_2 B_2
...
A_{N-1} B_{N-1}
Nếu đáp án đúng, chương trình chấm mẫu in số lần gọi query, chẳng hạn Accepted: 2024. Nếu đáp án sai, chương trình chấm mẫu in loại lỗi, chẳng hạn Wrong Answer [4]. Các dấu nháy không được in. Nếu chương trình vi phạm nhiều điều kiện, chỉ một loại lỗi được báo.
Các ví dụ sau gồm đầu vào của chương trình chấm mẫu và một chuỗi 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:
4 16
1 2
2 4
4 3
Lời gọi hàm
| Chương trình chấm gọi | Chương trình thí sinh gọi | Giá trị trả về |
|---|---|---|
solve(4, 16) |
||
query(2, 1) |
1 |
|
query(3, 1) |
4 |
|
answer(2, 4) |
||
query(2, 2) |
4 |
|
answer(2, 1) |
||
query(3, 2) |
2 |
|
query(2, 1) |
1 |
|
answer(3, 4) |
Giải thích
Chương trình thí sinh trả lời bằng các lời gọi answer, không in đáp án ra đầu ra chuẩn.
Khoảng cách từ đảo \(2\) đến các đảo \(1,3,4\) lần lượt là \(1,2,1\). Chẳng hạn, để đi từ đảo \(2\) đến đảo \(3\), có thể đi qua tuyến đường biển thứ \(2\) rồi tuyến thứ \(3\).
Xếp các đảo khác \(2\) theo \(\operatorname{dist}(2,i)\times N+i\) tăng dần thu được thứ tự \(1,4,3\). Vì thế, query(2, 1) trả về 1 và query(2, 2) trả về 4.
Ví dụ này thỏa mãn các nhóm \(2,6\), tương ứng với tệp mẫu chính thức sample-01-in.txt.
Ví dụ 2
Dữ liệu vào của trình chấm mẫu:
5 25
5 2
3 1
1 4
1 5
Lời gọi hàm
| Chương trình chấm gọi | Chương trình thí sinh gọi | Giá trị trả về |
|---|---|---|
solve(5, 25) |
||
query(1, 3) |
5 |
|
query(1, 4) |
2 |
|
answer(3, 1) |
||
query(2, 4) |
4 |
|
query(3, 1) |
1 |
|
query(3, 2) |
4 |
|
answer(1, 5) |
||
answer(4, 1) |
||
answer(2, 5) |
Giải thích
Chương trình thí sinh trả lời bằng các lời gọi answer, không in đáp án ra đầu ra chuẩn.
Khoảng cách từ đảo \(1\) đến các đảo \(2,3,4,5\) lần lượt là \(2,1,1,1\). Chẳng hạn, để đi từ đảo \(1\) đến đảo \(2\), có thể đi qua tuyến đường biển thứ \(4\) rồi tuyến thứ \(1\).
Xếp các đảo khác \(1\) theo \(\operatorname{dist}(1,i)\times N+i\) tăng dần thu được thứ tự \(3,4,5,2\). Vì thế, query(1, 3) trả về 5 và query(1, 4) trả về 2.
Ví dụ này thỏa mãn các nhóm \(4,6\), tương ứng với tệp mẫu chính thức sample-02-in.txt.
Cả sample-01-in.txt và sample-02-in.txt đều có thể dùng làm đầu vào của chương trình chấm mẫu.
JOI 2023/2024, kỳ thi tuyển chọn mùa xuân, ngày thi thứ tư (24/03/2024). Đề của Ủy ban Olympic Tin học Nhật Bản (JCIOI). Bản dịch tiếng Việt theo giấy phép CC BY-SA 4.0.
Một giải bóng bàn được tổ chức ở vương quốc JOI với \(N\) chú hải ly, được đánh số từ \(1\) đến \(N\). Giải đấu diễn ra theo thể thức vòng tròn: mỗi cặp đấu với nhau một trận.
Bitaro cho bạn biết các thông tin sau về kết quả giải đấu:
Bạn không biết thông tin của Bitaro có chính xác hay không. Hãy xác định có tồn tại kết quả giải đấu phù hợp với thông tin đó hay không; nếu có, hãy tìm một kết quả như vậy.
Một bộ dữ liệu gồm \(Q\) tình huống, được đánh số từ \(1\) đến \(Q\). Mỗi tình huống cho biết số hải ly tham gia \(N\) và số bộ ba tạo thành vòng thắng thua \(M\).
Đọc từ đầu vào chuẩn theo định dạng:
Q
N_1 M_1
N_2 M_2
...
N_Q M_Q
Cặp \(N_i,M_i\) là các giá trị \(N,M\) của tình huống thứ \(i\).
In đáp án cho các tình huống theo thứ tự từ \(1\) đến \(Q\).
Nếu tồn tại một kết quả phù hợp, in:
Yes
S_2
S_3
...
S_N
Với mỗi \(2 \le i \le N\), \(S_i\) là xâu độ dài \(i-1\) chỉ gồm 0 và 1. Ký tự thứ \(j\) \((1 \le j<i)\) của \(S_i\) là 0 nếu hải ly \(i\) thua hải ly \(j\), và là 1 nếu hải ly \(i\) thắng hải ly \(j\). Nếu có nhiều kết quả phù hợp, có thể in bất kỳ kết quả nào.
Nếu không tồn tại kết quả phù hợp, in No cho tình huống đó.
Ví dụ 1
2
3 1
4 4
Yes
0
10
No
Có \(Q=2\) tình huống. Trong tình huống thứ nhất của kết quả mẫu, hải ly \(1\) thắng \(2\), \(2\) thắng \(3\) và \(3\) thắng \(1\). Do đó, bộ ba \(1,2,3\) tạo thành vòng thắng thua. Đây là cách duy nhất để chọn ba hải ly, nên có đúng một bộ ba như yêu cầu.
Một đáp án khác cho riêng tình huống thứ nhất là:
Yes
1
01
Ở tình huống thứ hai, không tồn tại kết quả phù hợp, nên in No.
Ví dụ này thỏa mãn các nhóm \(2,3,4,5,6\).
Ví dụ 2
1
5 3
Yes
0
11
001
0101
Trong kết quả mẫu, hải ly \(1\) thắng \(4\), \(4\) thắng \(3\) và \(3\) thắng \(1\), nên bộ ba \(1,3,4\) tạo thành vòng thắng thua. Hai bộ ba khác có tính chất này là \(2,3,4\) và \(3,4,5\). Vì vậy, có đúng ba bộ ba như yêu cầu.
Ví dụ này thỏa mãn tất cả các nhóm.
JOI 2023/2024, kỳ thi tuyển chọn mùa xuân, ngày thi thứ tư (24/03/2024). Đề của Ủy ban Olympic Tin học Nhật Bản (JCIOI). Bản dịch tiếng Việt theo giấy phép CC BY-SA 4.0.