| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2014 - Bus | 100 (p) | 1.0s | 256M |
| 2 | JOI 2014 - Growing Vegetables is Fun | 100 (p) | 1.0s | 256M |
| 3 | JOI 2014 - Historical Research | 100 (p) | 4.0s | 512M |
| 4 | JOI 2014 - Ramen | 100 (p) | 1.0s | 256M |
JOI là một sinh viên đại học đi học bằng xe buýt. Nhà của JOI và trường đại học đều nằm trong thành phố IOI. Thành phố có \(N\) trạm xe buýt, được đánh số từ \(1\) đến \(N\). Trạm gần nhà JOI nhất là trạm \(1\), còn trạm gần trường nhất là trạm \(N\).
Có \(M\) chuyến xe buýt hoạt động trong thành phố. Mỗi chuyến chạy đúng một lần mỗi ngày, xuất phát từ một trạm xác định vào một thời điểm xác định và đến một trạm xác định vào một thời điểm xác định. Không có chuyến nào kéo dài sang ngày hôm sau. JOI không thể lên hoặc xuống xe giữa hành trình của một chuyến.
Mỗi ngày, JOI đi một hoặc nhiều chuyến xe buýt để đến trường. Có thể bỏ qua thời gian cần để chuyển xe: để lên một chuyến xuất phát từ một trạm vào một thời điểm nào đó, JOI chỉ cần đến trạm ấy trước hoặc đúng thời điểm xe xuất phát. JOI cũng có thể đi qua cùng một trạm nhiều lần.
Với những điều kiện trên, JOI muốn biết mình nên rời nhà khi nào để đến trường kịp giờ học. Tuy nhiên, giờ bắt đầu tiết học đầu tiên thay đổi theo từng ngày. Với \(Q\) ngày, đã biết thời điểm muộn nhất JOI phải đến trạm \(N\) để kịp giờ học trong từng ngày. Trong mỗi ngày đó, JOI có thể đến trạm \(1\) muộn nhất vào thời điểm nào mà vẫn kịp giờ học?
Cho thông tin về các chuyến xe buýt và thời điểm muộn nhất phải đến trạm \(N\) trong từng ngày của \(Q\) ngày, hãy tìm thời điểm muộn nhất JOI có thể đến trạm \(1\) trong mỗi ngày.
Đọc dữ liệu từ đầu vào chuẩn:
Ghi \(Q\) dòng ra đầu ra chuẩn. Dòng thứ \(j\) (\(1 \le j \le Q\)) chứa một số nguyên là thời điểm muộn nhất JOI có thể đến trạm \(1\) trong ngày thứ \(j\) mà vẫn đến trường kịp giờ học. Nếu không thể đến trường kịp giờ, ghi -1.
Tất cả dữ liệu vào thỏa mãn:
Ở đây, \(86\,400\,000 = 24 \times 60 \times 60 \times 1000\).
Ví dụ 1
5 6
1 2 10 25
1 2 12 30
2 5 26 50
1 5 5 20
1 4 30 40
4 5 50 70
4
10
30
60
100
-1
5
10
30
Không thể đến trạm \(5\) trước hoặc đúng thời điểm \(10\).
Để đến trước hoặc đúng thời điểm \(30\), JOI có thể lên chuyến xe thứ \(4\) vào thời điểm \(5\).
Để đến trước hoặc đúng thời điểm \(60\), JOI có thể đi như sau:
Để đến trước hoặc đúng thời điểm \(100\), JOI có thể đi như sau:
Ví dụ 2
3 8
1 2 1 5
1 3 0 1
1 3 2 8
2 3 2 3
2 3 3 4
2 3 4 5
2 3 5 6
2 3 6 7
6
3
4
5
6
7
8
0
0
0
1
1
2
JOI thích làm vườn và năm nào cũng trồng một loài cây có tên là cây IOI trên mảnh vườn của mình. Mảnh vườn được chia thành \(N\) ô nằm trên một hàng theo hướng đông–tây, đánh số từ \(1\) đến \(N\) theo thứ tự từ phía tây. Có tất cả \(N\) cây IOI, mỗi ô trồng một cây. Đến mùa xuân, cây IOI trồng ở ô \(i\) cao đến độ cao \(h_i\) rồi không cao thêm nữa.
Khi đến thăm vườn vào mùa xuân, JOI phát hiện các cây IOI được bố trí khác với dự định. Cây IOI cần nhiều ánh nắng: nếu ở cả phía có số ô nhỏ hơn và phía có số ô lớn hơn đều có một cây IOI cao hơn nó, cây đó sẽ héo trước khi mùa hè đến. Vì vậy, để không cây IOI nào bị héo, cần thỏa mãn điều kiện sau: với mọi số nguyên \(i\) thỏa mãn \(2 \le i \le N-1\), ít nhất một trong hai điều kiện dưới đây phải đúng.
Cây IOI rất đắt tiền nên JOI quyết định sắp xếp lại chúng để không cây nào bị héo. Vì cây IOI rất lớn và dễ bị tổn thương, JOI chỉ có thể đổi chỗ hai cây kề nhau. Cụ thể, trong một thao tác, JOI chọn một ô \(i\) bất kỳ (\(1 \le i \le N-1\)) rồi đổi chỗ cây ở ô \(i\) với cây ở ô \(i+1\). Mùa hè càng đến gần, nguy cơ cây bị héo càng cao, nên JOI muốn biết số thao tác ít nhất cần thực hiện để không cây IOI nào bị héo.
Cho số ô trong vườn và độ cao của từng cây IOI, hãy viết chương trình tìm số thao tác ít nhất cần thực hiện để sắp xếp lại các cây sao cho không cây nào bị héo.
Đọc dữ liệu từ đầu vào chuẩn:
Ghi ra đầu ra chuẩn một dòng chứa một số nguyên là số thao tác ít nhất cần thực hiện.
Tất cả dữ liệu vào thỏa mãn:
Ví dụ 1
6
2
8
4
5
3
6
3
Ban đầu, các cây IOI được bố trí như hình dưới đây.
Chẳng hạn, thực hiện các thao tác như hình dưới đây sẽ tạo được một cách bố trí không cây nào bị héo sau \(3\) thao tác: đổi chỗ cây ở ô \(2\) và ô \(3\); đổi chỗ cây ở ô \(3\) và ô \(4\); rồi đổi chỗ cây ở ô \(5\) và ô \(6\). Cách bố trí cuối cùng không làm cây IOI nào bị héo.
Ví dụ 2
5
4
4
2
4
4
2
Chỉ cần đưa cây IOI ở ô \(3\) đến ô \(1\) hoặc ô \(5\).
Ví dụ 3
4
1
3
4
2
0
Trong ví dụ này, không cần thực hiện thao tác đổi chỗ nào.
Giáo sư JOI, chuyên gia hàng đầu về lịch sử nước IOI, nhận được một cuốn nhật ký được cho là do một cư dân nước IOI thời cổ đại viết. Để nghiên cứu cuộc sống ở nước IOI thời cổ đại thông qua cuốn nhật ký này, giáo sư quyết định khảo sát các sự kiện được ghi lại trong đó.
Cuốn nhật ký ghi lại các sự kiện xảy ra trong \(N\) ngày, mỗi ngày đúng một sự kiện. Các sự kiện được chia thành nhiều loại. Loại của sự kiện vào ngày thứ \(i\) (\(1 \le i \le N\)) được biểu diễn bằng số nguyên \(X_i\). Giá trị \(X_i\) càng lớn thì sự kiện được xem là có quy mô càng lớn.
Giáo sư JOI quyết định phân tích nhật ký theo cách sau:
Giáo sư JOI giao cho bạn viết một chương trình phục vụ việc phân tích. Chương trình cần tìm được độ quan trọng lớn nhất khi được cho một khoảng thời gian cần phân tích.
Cho loại sự kiện của \(N\) ngày trong nhật ký và \(Q\) truy vấn, mỗi truy vấn chỉ định một khoảng thời gian trong nhật ký. Hãy viết chương trình tìm độ quan trọng lớn nhất của các loại sự kiện đối với từng truy vấn.
Đọc dữ liệu từ đầu vào chuẩn:
Ghi \(Q\) dòng ra đầu ra chuẩn. Dòng thứ \(j\) (\(1 \le j \le Q\)) chứa một số nguyên là độ quan trọng lớn nhất đối với truy vấn thứ \(j\).
Tất cả dữ liệu vào thỏa mãn:
Ví dụ 1
5 5
9 8 7 8 9
1 2
3 4
4 4
1 4
2 4
9
8
8
16
16
Ví dụ 2
8 4
9 9 19 9 9 15 9 19
1 4
4 6
3 5
5 8
27
18
19
19
Dữ liệu vào này thỏa mãn ràng buộc của subtask \(3\).
Ví dụ 3
12 15
15 9 3 15 9 3 3 8 16 9 3 17
2 7
2 5
2 2
1 12
4 12
3 6
11 12
1 7
2 6
3 5
3 10
7 10
1 4
4 8
4 8
18
18
9
30
18
15
17
30
18
15
18
16
30
15
15
JOI và IOI đều thích mì ramen. JOI thích ramen có vị thanh nhẹ, còn IOI thích ramen có vị đậm béo. Thị trấn nơi hai bạn sống có \(N\) quán ramen, được đánh số từ \(0\) đến \(N-1\).
Hai bạn chưa biết quán nào bán ramen đậm béo, quán nào bán ramen thanh nhẹ. Vì vậy, JOI và IOI quyết định đi ăn thử ở các quán trong thị trấn để xác định quán bán ramen thanh nhẹ nhất và quán bán ramen đậm béo nhất.
Mỗi quán có một độ đậm béo xác định cho món ramen của mình. Độ đậm béo là một số nguyên từ \(0\) đến \(N-1\), và độ đậm béo của các quán đôi một khác nhau. Mỗi ngày, JOI và IOI có thể đến hai quán, nếm thử và so sánh để biết quán nào trong hai quán có độ đậm béo cao hơn.
Vì sức khỏe, hai bạn muốn giới hạn số ngày ăn thử và so sánh ramen ở mức không quá \(600\) ngày.
Cho số quán ramen \(N\) trong thị trấn, hãy viết chương trình xác định quán có độ đậm béo thấp nhất và quán có độ đậm béo cao nhất trong số \(N\) quán, bằng cách ăn thử và so sánh trong không quá \(600\) ngày.
Bạn cần viết một chương trình cài đặt cách xác định hai quán nói trên bằng không quá \(600\) lần so sánh. Gói chương trình được cung cấp có tệp tiêu đề ramen.h; mã nguồn của bạn khai báo:
#include "ramen.h"
Chương trình phải cài đặt hàm sau:
void Ramen(int N);
Hàm này được gọi đúng một lần cho mỗi bộ dữ liệu. Tham số N là số quán ramen trong thị trấn. Hàm phải dùng các lời gọi Compare để xác định quán có độ đậm béo thấp nhất và quán có độ đậm béo cao nhất, rồi kết thúc bằng cách gọi Answer.
Chương trình của bạn có thể gọi hàm sau:
int Compare(int X, int Y);
Hàm này thực hiện một lần ăn thử và so sánh ramen. Các tham số X, Y là số hiệu của hai quán được so sánh.
X và Y phải là hai số nguyên khác nhau, đều thuộc đoạn từ \(0\) đến \(N-1\). Nếu gọi Compare với tham số không thỏa mãn điều kiện này, chương trình bị đánh giá Wrong Answer [1] và kết thúc.1 nếu độ đậm béo của quán X lớn hơn độ đậm béo của quán Y.-1 nếu độ đậm béo của quán X nhỏ hơn độ đậm béo của quán Y.Compare quá \(600\) lần, chương trình bị đánh giá Wrong Answer [2] và kết thúc.Hàm Ramen phải kết thúc bằng cách gọi hàm sau. Nếu Ramen không gọi Answer, chương trình bị đánh giá Wrong Answer [3] và kết thúc.
void Answer(int X, int Y);
Chỉ gọi hàm này khi các phép so sánh đã xác định được quán có độ đậm béo thấp nhất và quán có độ đậm béo cao nhất. X là số hiệu quán có độ đậm béo thấp nhất; Y là số hiệu quán có độ đậm béo cao nhất.
X và Y đều phải là số nguyên từ \(0\) đến \(N-1\). Nếu tham số không thỏa mãn điều kiện này, chương trình bị đánh giá Wrong Answer [4].Compare, và bạn gọi Answer với đúng cặp đáp án đó, chương trình được chấp nhận. Nếu không, chương trình bị đánh giá Wrong Answer [5].Answer được gọi, chương trình kết thúc.Khi chấm bài, nếu kết quả của các lời gọi Compare chưa xác định duy nhất đáp án, chương trình sẽ bị đánh giá Wrong Answer [5], bất kể các tham số truyền vào Answer là gì.
Trong một số bộ dữ liệu chấm, giá trị trả về của Compare có thể thay đổi tùy theo các lời gọi Compare trước đó. Ngay cả trong trường hợp này, giá trị trả về vẫn không mâu thuẫn với kết quả của bất kỳ lời gọi Compare nào trước đó.
Gói dữ liệu chính thức chứa trình chấm mẫu để kiểm thử chương trình của bạn, cùng với các tệp mã nguồn mẫu cần nộp. Các tệp dành cho bài này nằm trong thư mục ramen/dist/ của gói dữ liệu.
Trình chấm mẫu gồm một tệp: grader.c hoặc grader.cpp. Chẳng hạn, nếu chương trình của bạn được lưu trong Ramen.c hoặc Ramen.cpp, hãy đặt tệp chương trình, tệp trình chấm tương ứng và ramen.h trong cùng thư mục rồi biên dịch như sau.
Với C:
gcc -O2 -lm grader.c Ramen.c -o grader
Với C++:
g++ -O2 grader.cpp Ramen.cpp -o grader
Nếu biên dịch thành công, tệp thực thi grader sẽ được tạo ra.
Lưu ý rằng trình chấm thật khác với trình chấm mẫu. 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.
Trình chấm mẫu đọc dữ liệu từ đầu vào chuẩn theo định dạng sau:
Nếu quá trình thực thi kết thúc bình thường, trình chấm mẫu ghi một dòng thông tin sau ra đầu ra chuẩn, không kèm dấu ngoặc kép:
Accepted.Wrong Answer [2].Lưu ý: nếu gọi Answer(X, Y) với \(A_X = 0\) và \(A_Y = N-1\), trình chấm mẫu vẫn chấp nhận ngay cả khi trường hợp đó thuộc lỗi Wrong Answer [5] do các phép so sánh chưa xác định duy nhất đáp án. Hành vi này khác với trình chấm thật.
Tất cả dữ liệu thỏa mãn \(1 \le N \le 400\).
Dưới đây là một ví dụ dữ liệu vào của trình chấm mẫu và một dãy lời gọi hàm tương ứng.
3 1
1
2
0
| Lời gọi | Giá trị trả về |
|---|---|
Compare(0, 1) |
-1 |
Compare(0, 2) |
1 |
Answer(2, 1) |
Chương trình kết thúc. |