| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2024 - Card Collection | 100 (p) | 4.0s | 1G |
| 2 | JOI 2024 - JOI Tour | 100 (p) | 3.0s | 1G |
| 3 | JOI 2024 - Tower | 100 (p) | 2.0s | 1G |
JOI-kun rất thích sưu tập thẻ trong một trò chơi. Mỗi thẻ có hai số nguyên biểu thị sức mạnh và chi phí. Để có thẻ mới, JOI-kun mang \(N\) thẻ đến nơi đổi thẻ. Các thẻ được đánh số từ \(1\) đến \(N\); thẻ \(i\) có sức mạnh \(S_i\) và chi phí \(V_i\).
Tại đây có hai loại máy. Khi đưa hai thẻ \(A\) và \(B\) vào một máy, JOI-kun nhận được một thẻ \(C\) theo quy tắc sau:
JOI-kun muốn đổi thẻ đúng \(N-1\) lần để cuối cùng chỉ còn một thẻ. Ban đầu, cậu xếp các thẻ thành một hàng theo thứ tự từ thẻ \(1\) đến thẻ \(N\), rồi lặp lại thao tác sau đúng \(N-1\) lần:
Chọn hai thẻ kề nhau, lấy chúng ra khỏi hàng và đổi bằng một trong hai máy. Đặt thẻ mới vào vị trí của hai thẻ vừa lấy ra.
Sức mạnh và chi phí của thẻ cuối cùng phụ thuộc vào các thao tác được chọn. JOI-kun có danh sách \(M\) thẻ muốn nhận được. Thẻ thứ \(j\) trong danh sách được biểu diễn bởi cặp \((T_j,W_j)\), tương ứng với sức mạnh và chi phí.
Cho thông tin về các thẻ ban đầu và danh sách mong muốn, hãy xác định tất cả các thẻ trong danh sách mà JOI-kun có thể nhận được sau đúng \(N-1\) thao tác.
In trên một dòng chỉ số của tất cả các thẻ trong danh sách có thể nhận được sau đúng \(N-1\) thao tác, theo thứ tự tăng dần và cách nhau bởi dấu cách. Nếu không có thẻ nào như vậy, in một dòng trống.
Ví dụ 1
5 3
1 3
2 2
4 4
1 3
1 1
2 3
2 1
4 4
1 3
Chẳng hạn, JOI-kun có thể nhận được thẻ có sức mạnh \(2\) và chi phí \(3\) bằng cách:
Dù đã có thẻ mong muốn sau thao tác thứ ba, JOI-kun vẫn phải thực hiện thao tác cuối cùng để chỉ còn một thẻ. Một thẻ có thể xuất hiện ở giữa quá trình nhưng chưa chắc có thể là thẻ cuối cùng.
Ví dụ này thỏa mãn ràng buộc của tất cả các nhóm.
Ví dụ 2
2 2
1 1
2 2
1 2
2 1
Không thể nhận được thẻ nào trong danh sách sau \(N-1\) thao tác, nên cần in một dòng trống.
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 8
5 2
4 4
1 3
7 8
3 1
8 7
6 5
2 6
1 4
7 2
8 8
3 1
5 6
2 7
6 3
2 5
3 4 5 8
Ví dụ này thỏa mãn ràng buộc của tất cả các nhóm.
Giới hạn thời gian là \(4\) giây; giới hạn bộ nhớ là \(1024\) MB.
Đề bài của Ủy ban Olympic Tin học Nhật Bản, JOI 2023/2024, vòng tuyển chọn mùa xuân, ngày thi thứ ba. Đề gốc và bản dịch tiếng Việt được cung cấp theo giấy phép CC BY-SA 4.0.
Đất nước IOI có \(N\) thị trấn, được đánh số từ \(0\) đến \(N-1\), và \(N-1\) con đường, được đánh số từ \(0\) đến \(N-2\). Đường \(j\) nối hai chiều thị trấn \(U_j\) và thị trấn \(V_j\). Có thể đi giữa hai thị trấn bất kỳ bằng cách đi qua một số con đường.
Mỗi thị trấn có một nhà hàng. Loại nhà hàng ở thị trấn \(i\) được biểu diễn bởi số nguyên \(F_i\):
Rie là hướng dẫn viên du lịch và đang xây dựng chuyến tham quan mang tên JOI Tour, gồm các bước sau:
Để khách không cảm thấy nhàm chán, Rie chỉ chọn ba thị trấn sao cho không có con đường nào được đi qua hai lần trong chuyến đi. Một JOI Tour như vậy được gọi là tốt.
Bạn cần tính số bộ ba \((i_0,i_1,i_2)\) thỏa mãn đồng thời các điều kiện:
Sẽ có \(Q\) lần thay đổi loại nhà hàng. Trong lần thay đổi thứ \(k+1\) (\(0 \le k \le Q-1\)), bạn được cung cấp hai số nguyên \(X_k,Y_k\). Nhà hàng ở thị trấn \(X_k\) được đổi sang loại \(Y_k\): nước ép nếu \(Y_k=0\), trứng ốp lết nếu \(Y_k=1\), kem nếu \(Y_k=2\). Ngay sau mỗi lần thay đổi, bạn phải cập nhật số JOI Tour tốt và trả kết quả cho Rie.
Bạn cần nộp một tệp tên joitour.cpp. Tệp này phải dùng chỉ thị #include để nạp joitour.h và cài đặt các hàm sau:
void init(int N, std::vector<int> F, std::vector<int> U,
std::vector<int> V, int Q);
void change(int X, int Y);
long long num_tours();
Hàm init được gọi đúng một lần ở đầu chương trình để cung cấp thông tin ban đầu. Tham số N là số thị trấn, F là mảng có độ dài \(N\) với F[i] là loại nhà hàng ở thị trấn \(i\). Hai mảng U,V có độ dài \(N-1\); U[j],V[j] là hai đầu của đường \(j\). Tham số Q là số lần thay đổi loại nhà hàng.
Hàm change được gọi đúng \(Q\) lần. Trong lần gọi thứ \(k+1\), X là thị trấn \(X_k\) và Y là loại nhà hàng mới \(Y_k\). Loại mới được bảo đảm khác loại hiện tại.
Hàm num_tours được gọi ngay sau init và ngay sau mỗi lần gọi change, tổng cộng \(Q+1\) lần. Mỗi lần gọi phải trả về số JOI Tour tốt ở thời điểm đó.
Bạn được phép cài đặt thêm hàm phụ và khai báo biến toàn cục. Chương trình của bạn không được đọc hoặc ghi qua đầu vào chuẩn, đầu ra chuẩn hay bất kỳ tệp nào. Có thể ghi thông tin gỡ lỗi ra đầu ra lỗi chuẩn.
Gói tệp được cung cấp chứa chương trình chấm mẫu grader.cpp, tệp khai báo joitour.h, tệp cài đặt mẫu joitour.cpp và compile.sh. Để kiểm tra chương trình, đặt grader.cpp, joitour.cpp và joitour.h trong cùng thư mục và dùng lệnh:
g++ -std=gnu++20 -O2 -o grader grader.cpp joitour.cpp
Cũng có thể chạy compile.sh. 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 dữ liệu từ đầu vào chuẩn và in kết quả ra đầu ra chuẩn.
Sau mỗi lần gọi num_tours, chương trình chấm mẫu in giá trị trả về trên một dòng. Vì vậy, có \(Q+1\) dòng kết quả.
change, loại nhà hàng mới khác loại nhà hàng hiện tại.Ký hiệu \(\lfloor j/2\rfloor\) là số nguyên lớn nhất không vượt quá \(j/2\).
Ví dụ 1
Dữ liệu vào của trình chấm mẫu:
3
0 1 2
0 1
1 2
0
Dữ liệu ra của trình chấm mẫu:
1
Giải thích
Các lời gọi tương ứng là:
| Lời gọi | Giá trị trả về |
|---|---|
init(3, [0, 1, 2], [0, 1], [1, 2], 0) |
|
num_tours() |
1 |
Chỉ có một JOI Tour tốt, ứng với \((i_0,i_1,i_2)=(0,1,2)\). Thị trấn \(0\) có nhà hàng nước ép vì \(F_0=0\); thị trấn \(1\) có nhà hàng trứng ốp lết vì \(F_1=1\); thị trấn \(2\) có nhà hàng kem vì \(F_2=2\). Đi từ \(0\) đến \(1\), rồi từ \(1\) đến \(2\) theo đường đi ngắn nhất không đi qua đường nào hai lần. Vì vậy, lần gọi num_tours đầu tiên trả về \(1\).
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
Dữ liệu vào của trình chấm mẫu:
3
0 1 2
0 1
1 2
2
2 0
0 2
Dữ liệu ra của trình chấm mẫu:
1
0
1
Giải thích
Các lời gọi tương ứng là:
| Lời gọi | Giá trị trả về |
|---|---|
init(3, [0, 1, 2], [0, 1], [1, 2], 2) |
|
num_tours() |
1 |
change(2, 0) |
|
num_tours() |
0 |
change(0, 2) |
|
num_tours() |
1 |
Ban đầu chỉ có JOI Tour tốt \((0,1,2)\), nên giá trị trả về đầu tiên là \(1\).
Sau lần thay đổi thứ nhất, nhà hàng kem ở thị trấn \(2\) trở thành nhà hàng nước ép. Không còn nhà hàng kem nào, nên không có JOI Tour tốt và giá trị trả về thứ hai là \(0\).
Sau lần thay đổi thứ hai, nhà hàng nước ép ở thị trấn \(0\) trở thành nhà hàng kem. Khi đó có đúng một JOI Tour tốt \((2,1,0)\), nên giá trị trả về thứ ba là \(1\).
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
Dữ liệu vào của trình chấm mẫu:
7
1 0 2 2 0 1 0
0 1
0 2
1 3
1 4
2 5
2 6
7
0 0
1 1
2 0
3 0
4 2
5 2
6 2
Dữ liệu ra của trình chấm mẫu:
3
0
4
4
0
4
5
5
Giải thích
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,5,6,7\).
Giới hạn thời gian là \(3\) giây; giới hạn bộ nhớ là \(1024\) MB.
Đề bài của Ủy ban Olympic Tin học Nhật Bản, JOI 2023/2024, vòng tuyển chọn mùa xuân, ngày thi thứ ba. Đề gốc và bản dịch tiếng Việt được cung cấp theo giấy phép CC BY-SA 4.0.
Tháp IOI rất cao và có một cầu thang gồm \(10^{100}\) bậc, được đánh số từ dưới lên là \(0,1,\ldots\). JOI-kun đang ở bậc \(0\) và muốn đi lên. Cậu có thể thực hiện hai loại hành động sau, nhưng không được đi xuống:
Hiện có \(N\) công trình trên cầu thang. Công trình thứ \(i\) nằm trên các bậc \(L_i,L_i+1,\ldots,R_i\). JOI-kun không được đặt chân lên các bậc đang thi công.
Tháp có \(Q\) phòng được đánh số từ \(1\) đến \(Q\). Có thể vào phòng \(j\) từ bậc \(X_j\). Với mỗi phòng, JOI-kun muốn biết có thể tới được bậc đó hay không và, nếu có, thời gian ít nhất cần dùng.
Cho thông tin về JOI-kun, các công trình và các phòng, hãy trả lời yêu cầu trên với mọi \(1 \le j \le Q\).
In \(Q\) dòng. Dòng thứ \(j\) chứa thời gian ít nhất, tính bằng giây, để tới bậc \(X_j\) nếu có thể; nếu không thể, in -1.
Ví dụ 1
3 1
4 10 35
4 5
10 12
14 14
13
120
JOI-kun có thể tới bậc \(13\) trong \(120\) giây theo các bước sau:
Không thể tới bậc \(13\) trong ít hơn \(120\) giây, nên đáp án là \(120\).
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,4\).
Ví dụ 2
5 10
10 1 9
7 11
25 32
37 38
43 44
50 52
6
12
18
24
30
36
42
48
54
60
6
11
17
22
-1
33
-1
44
-1
55
Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,4\).
Giới hạn thời gian là \(2\) giây; giới hạn bộ nhớ là \(1024\) MB.
Đề bài của Ủy ban Olympic Tin học Nhật Bản, JOI 2023/2024, vòng tuyển chọn mùa xuân, ngày thi thứ ba. Đề gốc và bản dịch tiếng Việt được cung cấp theo giấy phép CC BY-SA 4.0.