| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2024 - Fish 3 | 100 (p) | 2.0s | 1G |
| 2 | JOI 2024 - Ski 2 | 100 (p) | 2.0s | 1G |
| 3 | JOI 2024 - Spy 3 | 100 (p) | 1.0s | 1G |
JOI-kun đang nuôi \(N\) con cá trong một bể lớn. Các con cá được đánh số từ \(1\) đến \(N\).
JOI-kun có hai loại thức ăn \(A\) và \(B\), với số lượng đủ nhiều. Khi thả một viên thức ăn vào bể, đúng một con cá ăn viên đó (bất kỳ con cá nào cũng có thể ăn được). Tùy vào loại thức ăn và con cá đã ăn, độ thông minh của các con cá thay đổi như sau:
Hiện tại, độ thông minh của mọi con cá đều bằng \(0\). JOI-kun muốn độ thông minh của cá \(i\) (\(1 \le i \le N\)) bằng giá trị lý tưởng \(C_i\), nhưng điều này không phải lúc nào cũng thực hiện được.
Vì vậy, cậu đặt ra \(Q\) câu hỏi. Câu hỏi thứ \(j\) (\(1 \le j \le Q\)) như sau:
Hãy viết chương trình trả lời các câu hỏi khi biết thông tin về đàn cá và các câu hỏi của JOI-kun.
Đọc từ đầu vào chuẩn theo định dạng:
N D
C_1 C_2 ... C_N
Q
L_1 R_1
L_2 R_2
...
L_Q R_Q
In \(Q\) dòng ra đầu ra chuẩn. Trên dòng thứ \(j\) (\(1 \le j \le Q\)), nếu có thể làm cho tất cả các con cá \(L_j,L_j+1,\ldots,R_j\) đạt đúng độ thông minh lý tưởng tương ứng, in số viên thức ăn loại \(A\) ít nhất cần thả vào bể. Nếu không thể, in -1.
Ví dụ 1
4 2
3 1 2 1
1
1 3
1
Ví dụ, trong trường hợp sau, cuối cùng các con cá \(1,2,3\) đều đạt đúng độ thông minh lý tưởng, và chỉ có \(1\) viên thức ăn loại \(A\) được thả vào bể:
Không thể làm cho cả ba con cá \(1,2,3\) đạt đúng độ thông minh lý tưởng mà không thả viên thức ăn loại \(A\) nào, nên kết quả là 1.
Ví dụ này thỏa mãn các ràng buộc của bài toán con \(1,5\).
Ví dụ 2
4 2
0 1 0 1
3
1 2
2 3
1 1
0
-1
0
Ví dụ này thỏa mãn các ràng buộc của bài toán con \(1,2,5\).
Ví dụ 3
5 1
3 1 4 1 5
3
1 5
2 4
3 5
5
3
3
Ví dụ này thỏa mãn các ràng buộc của bài toán con \(1,3,5\).
Ví dụ 4
6 3
16 14 13 8 6 5
4
1 4
2 5
3 3
1 6
9
8
0
-1
Ví dụ này thỏa mãn các ràng buộc của bài toán con \(1,4,5\).
Bản dịch tiếng Việt từ đề tiếng Anh và tiếng Nhật của JOI 2023/2024, vòng tuyển chọn mùa xuân, ngày thi thứ nhất, do Ủy ban Olympic Tin học Nhật Bản (JCIOI) cung cấp. Đề gốc và bản dịch được cung cấp theo giấy phép CC BY-SA 4.0.
Ông JOI quản lý một khu trượt tuyết nổi tiếng trên cao nguyên IOI. Để kỷ niệm \(15\) năm ngày khai trương, ông quyết định xây dựng một khu trượt tuyết mới trên cao nguyên KOI nằm liền kề.
Cao nguyên KOI có \(N\) địa điểm, được đánh số từ \(1\) đến \(N\). Hiện tại, địa điểm \(i\) (\(1 \le i \le N\)) có độ cao \(H_i\) mét, và chưa có đường trượt nào nối các địa điểm. Ngoài ra, tại mỗi địa điểm đã có sẵn một thiết bị kết nối chưa được sử dụng.
Mục tiêu của ông JOI là xây khách sạn KOI tại một trong \(N\) địa điểm, sau đó xây các đường trượt sao cho có thể trượt xuống khách sạn từ bất kỳ địa điểm nào. Cụ thể, ông thực hiện các bước theo thứ tự sau:
Chi phí xây dựng khu trượt tuyết là tổng chi phí đắp đất và mở rộng đã thực hiện.
Hãy viết chương trình tìm chi phí xây dựng nhỏ nhất khi biết thông tin của mỗi địa điểm và chi phí \(K\) cho một lần đắp đất.
Đọc từ đầu vào chuẩn theo định dạng:
N K
H_1 C_1
H_2 C_2
...
H_N C_N
In một dòng ra đầu ra chuẩn chứa chi phí nhỏ nhất để xây dựng khu trượt tuyết.
Ví dụ 1
5 2
0 6
1 1
0 5
2 1
1 2
8
Ví dụ, có thể xây khu trượt tuyết như sau:
Tổng chi phí là \(6+2=8\). Không thể xây khu trượt tuyết với chi phí không quá \(7\), nên kết quả là 8.
Ví dụ này thỏa mãn các ràng buộc của bài toán con \(3,4,5,6\).
Ví dụ 2
5 100000
0 6
1 1
0 5
2 1
1 2
100010
Ví dụ này chỉ khác ví dụ \(1\) ở giá trị \(K\).
Ví dụ này thỏa mãn các ràng buộc của bài toán con \(1,3,4,5,6\).
Ví dụ 3
8 8
0 36
1 47
2 95
0 59
1 54
0 95
1 87
2 92
108
Ví dụ này thỏa mãn các ràng buộc của bài toán con \(2,3,4,5,6\).
Bản dịch tiếng Việt từ đề tiếng Anh và tiếng Nhật của JOI 2023/2024, vòng tuyển chọn mùa xuân, ngày thi thứ nhất, do Ủy ban Olympic Tin học Nhật Bản (JCIOI) cung cấp. Đề gốc và bản dịch được cung cấp theo giấy phép CC BY-SA 4.0.
Aoi và Bitaro là các điệp viên thuộc Cục Thông tin Quốc gia của nước JOI. Nhiệm vụ lần này của họ là bí mật điều tra nước IOI. Bitaro xâm nhập vào nước IOI, còn Aoi ở nước JOI để đưa ra chỉ dẫn.
Trước khi xâm nhập, Aoi và Bitaro đã có được bản đồ nước IOI. Nước IOI có \(N\) thành phố, được đánh số từ \(0\) đến \(N-1\), và \(M\) con đường, được đánh số từ \(0\) đến \(M-1\). Đường \(i\) (\(0 \le i \le M-1\)) nối hai chiều giữa thành phố \(A_i\) và thành phố \(B_i\), có độ dài \(C_i\). Có thể đi từ bất kỳ thành phố nào đến bất kỳ thành phố nào khác qua một số con đường. Bitaro di chuyển giữa các thành phố bằng những con đường này.
Ngoài ra, có \(Q\) kế hoạch điều tra. Kế hoạch thứ \(j\) (\(0 \le j \le Q-1\)) yêu cầu điều tra thành phố \(T_j\).
Cả Aoi và Bitaro đều được cung cấp toàn bộ thông tin trên trước khi Bitaro xâm nhập vào nước IOI.
Sau khi thoát khỏi nhiều kẻ truy đuổi và đánh bại các sát thủ, Bitaro cuối cùng đã vào được thành phố \(0\). Tuy nhiên, do nhiệm vụ xâm nhập quá khó khăn, cậu đã làm mất một phần thông tin về nước IOI. Cụ thể, cậu mất thông tin về độ dài của \(K\) con đường \(X_0,X_1,\ldots,X_{K-1}\), tức là không còn biết các giá trị \(C_{X_0},C_{X_1},\ldots,C_{X_{K-1}}\). Chỉ Bitaro mất những thông tin này; Aoi vẫn giữ chúng.
Bitaro lập tức báo cho Aoi biết mình đã mất thông tin độ dài của những con đường nào.
Để hoàn thành nhiệm vụ, Bitaro muốn biết một đường đi ngắn nhất từ thành phố \(0\) đến từng thành phố trong \(Q\) kế hoạch điều tra.
Aoi sẽ gửi cho Bitaro một xâu chỉ gồm các ký tự '0' và '1' để giúp cậu. Do có nguy cơ bị chặn bắt thông tin, Aoi muốn lượng thông tin gửi đi càng ít càng tốt.
Hãy viết chương trình thực hiện chiến lược của Aoi để gửi xâu khi biết thông tin về nước IOI, các kế hoạch điều tra và những con đường mà Bitaro mất thông tin. Đồng thời, hãy viết chương trình thực hiện chiến lược của Bitaro để tìm các đường đi ngắn nhất từ những thông tin cậu còn giữ và xâu nhận được từ Aoi.
Trên LQDOJ, bạn nộp một tệp mã nguồn C++, nạp spy3.h, cài đặt cả hai hàm aoi và bitaro với đúng giao diện bên dưới, và không viết hàm main. Đặt các hàm phụ của hai vai trò trong các namespace riêng để tránh trùng tên khi gộp mã nguồn. Bộ chấm chạy hai vai trò trong hai tiến trình riêng biệt; không được dùng biến toàn cục để truyền thông tin giữa chúng.
Phần mô tả hai tệp và lệnh biên dịch bộ chấm mẫu dưới đây là giao diện gốc của cuộc thi, được giữ nguyên để dùng với tệp hỗ trợ chính thức đính kèm. Yêu cầu nộp một tệp ở trên chỉ thay đổi cách đóng gói mã nguồn trên LQDOJ, không thay đổi giao diện hàm, quy tắc giao tiếp hay cách tính điểm.
Bạn phải nộp hai tệp.
Tệp thứ nhất có tên Aoi.cpp, thực hiện chiến lược của Aoi. Tệp này phải nạp Aoi.h bằng chỉ thị #include và cài đặt hàm sau:
std::string aoi(int N, int M, int Q, int K, std::vector<int> A,
std::vector<int> B, std::vector<long long> C,
std::vector<int> T, std::vector<int> X)
Hàm này được gọi đúng một lần cho mỗi bộ dữ liệu.
N là số thành phố của nước IOI.M là số con đường.Q là số kế hoạch điều tra.K là số con đường mà Bitaro mất thông tin về độ dài.A, B, C là các mảng độ dài M. Đường i (\(0 \le i \le M-1\)) nối hai chiều giữa thành phố A[i] và thành phố B[i], có độ dài C[i].T là mảng độ dài Q. Kế hoạch thứ j (\(0 \le j \le Q-1\)) yêu cầu điều tra thành phố T[j].X là mảng độ dài K, cho biết Bitaro mất thông tin độ dài của các đường X[0], X[1], ..., X[K-1].s mà Aoi gửi cho Bitaro.s phải là '0' hoặc '1'. Nếu không, chương trình bị chấm Wrong Answer [1].s phải không quá \(12\,000\). Nếu không, chương trình bị chấm Wrong Answer [2].Tệp thứ hai có tên Bitaro.cpp, thực hiện chiến lược của Bitaro. Tệp này phải nạp Bitaro.h bằng chỉ thị #include và cài đặt hàm sau:
void bitaro(int N, int M, int Q, int K, std::vector<int> A,
std::vector<int> B, std::vector<long long> C,
std::vector<int> T, std::vector<int> X, std::string s)
Hàm này được gọi đúng một lần sau khi hàm aoi được gọi.
N là số thành phố của nước IOI.M là số con đường.Q là số kế hoạch điều tra.K là số con đường mà Bitaro mất thông tin về độ dài.A, B, C là các mảng độ dài M. Đường i (\(0 \le i \le M-1\)) nối hai chiều giữa thành phố A[i] và thành phố B[i], có độ dài C[i]. Tuy nhiên, các phần tử C[X[0]], C[X[1]], ..., C[X[K-1]] được gán -1 thay cho độ dài thật, vì Bitaro đã mất những thông tin này.T là mảng độ dài Q. Kế hoạch thứ j (\(0 \le j \le Q-1\)) yêu cầu điều tra thành phố T[j].X là mảng độ dài K, cho biết Bitaro mất thông tin độ dài của các đường X[0], X[1], ..., X[K-1].s là xâu chỉ gồm các ký tự '0' và '1' mà Aoi gửi cho Bitaro.Trong Bitaro.cpp, chương trình có thể gọi hàm sau:
void answer(const std::vector<int> &e)
Ở lần gọi thứ \(j+1\) (\(0 \le j \le Q-1\)), bạn phải đưa ra một đường đi ngắn nhất từ thành phố \(0\) đến thành phố \(T_j\), là mục tiêu của kế hoạch điều tra thứ \(j\).
e là mảng biểu diễn đường đi ngắn nhất đó. Nếu độ dài mảng là \(n\), các phần tử e[0], e[1], ..., e[n-1] là số thứ tự của các con đường trên đường đi, theo đúng thứ tự di chuyển.e 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 [3].e phải tạo thành một đường đi từ thành phố \(0\) đến thành phố \(T_j\). Chính xác hơn, phải tồn tại dãy \(u_0,u_1,\ldots,u_n\) sao cho \(u_0=0\), \(u_n=T_j\), và đường e[k] nối \(u_k\) với \(u_{k+1}\) với mọi \(0 \le k \le n-1\). Nếu không, chương trình bị chấm Wrong Answer [4].e phải là một đường đi ngắn nhất trong tất cả các đường đi từ thành phố \(0\) đến thành phố \(T_j\). Độ dài đường đi là tổng độ dài các con đường được sử dụng. Nếu đường đi không ngắn nhất, chương trình bị chấm Wrong Answer [5].answer đúng \(Q\) lần. Nếu số lần gọi không bằng \(Q\) khi hàm bitaro kết thúc, chương trình bị chấm Wrong Answer [6].Tệp hỗ trợ chính thức đính kèm chứa chương trình chấm mẫu và các tệp mã nguồn mẫu cần nộp.
Chương trình chấm mẫu là grader.cpp. Để thử chương trình, đặt grader.cpp, Aoi.cpp, Bitaro.cpp, Aoi.h và Bitaro.h trong cùng thư mục, rồi biên dịch bằng lệnh sau; cũng có thể dùng compile.sh trong tệp hỗ trợ:
g++ -std=gnu++20 -O2 -o grader grader.cpp Aoi.cpp Bitaro.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 thật khác chương trình chấm mẫu. Chương trình chấm mẫu chỉ chạy trong một tiến trình, đọc từ đầu vào chuẩn và ghi kết quả ra đầu ra chuẩn cùng đầu ra lỗi chuẩn.
Chương trình chấm mẫu đọc dữ liệu theo định dạng:
N M
A_0 B_0 C_0
A_1 B_1 C_1
...
A_{M-1} B_{M-1} C_{M-1}
Q
T_0 T_1 ... T_{Q-1}
K
X_0 X_1 ... X_{K-1}
Chương trình chấm mẫu ghi thông tin sau ra đầu ra chuẩn và đầu ra lỗi chuẩn (không bao gồm dấu ngoặc kép):
Wrong Answer [1], ra đầu ra lỗi chuẩn. Không có gì được ghi ra đầu ra chuẩn.s do aoi trả về được ghi ra đầu ra lỗi chuẩn theo định dạng như Accepted: 2024. Đồng thời, trên dòng thứ \(j+1\) của đầu ra chuẩn (\(0 \le j \le Q-1\)), chương trình chấm mẫu ghi độ dài đường đi trong lần gọi answer thứ \(j+1\). Chương trình chấm mẫu không kiểm tra đường đi có ngắn nhất hay không.Nếu chương trình vi phạm nhiều điều kiện gây Wrong Answer, chương trình chấm mẫu chỉ báo một loại lỗi trong số đó.
Nếu có bất kỳ bộ dữ liệu nào bị chấm Wrong Answer [1] đến [6], quá giới hạn thời gian, quá giới hạn bộ nhớ hoặc lỗi chạy khác, điểm của bài là \(0\).
Nếu chương trình trả lời đúng mọi bộ dữ liệu, gọi \(L\) là độ dài lớn nhất của xâu s do hàm aoi trả về trên tất cả các bộ dữ liệu của bài. Điểm được tính như sau:
Ở đây, \(\lfloor x\rfloor\) là số nguyên lớn nhất không vượt quá \(x\).
Dưới đây là dữ liệu vào mẫu cho chương trình chấm mẫu và các lời gọi hàm tương ứng.
Ví dụ giao tiếp 1
Dữ liệu vào của trình chấm mẫu:
3 3
1 2 1
0 2 2
0 1 3
2
2 1
2
0 1
Giải thích
Lời gọi đầu tiên:
aoi(3, 3, 2, 2, [1, 0, 0], [2, 2, 1], [1, 2, 3], [2, 1], [0, 1])
Giá trị trả về là "101001". Sau đó, hàm sau được gọi:
bitaro(3, 3, 2, 2, [1, 0, 0], [2, 2, 1], [-1, -1, 3], [2, 1], [0, 1], "101001")
Trong hàm bitaro, các lời gọi trả lời lần lượt là:
answer([1])
answer([1, 0])
Có hai đường đi ngắn nhất từ thành phố \(0\) đến thành phố \(1\): đi qua đường \(1\) rồi đường \(0\), hoặc chỉ đi qua đường \(2\). Vì vậy, lời gọi answer thứ hai cũng có thể là answer([2]).
Tệp sample-01-in.txt được cung cấp trên trang cuộc thi tương ứng với dữ liệu vào mẫu \(1\). Hai tệp sample-01-in.txt và sample-02-in.txt trong dữ liệu tải về của cuộc thi đều có thể dùng làm đầu vào cho chương trình chấm mẫu.
Bản dịch tiếng Việt từ đề tiếng Anh và tiếng Nhật của JOI 2023/2024, vòng tuyển chọn mùa xuân, ngày thi thứ nhất, do Ủy ban Olympic Tin học Nhật Bản (JCIOI) cung cấp. Đề gốc và bản dịch được cung cấp theo giấy phép CC BY-SA 4.0.