IOI 2014 - Rail
Xem PDFĐài Loan có một hệ thống đường tàu lớn nối hai bờ đông và tây của hòn đảo. Hệ thống gồm \(m\) khối liên tiếp, được đánh số \(0, \ldots, m-1\) bắt đầu từ đầu phía tây. Mỗi khối có một tuyến đường một chiều ở phía bắc đi về hướng tây, một tuyến đường một chiều ở phía nam đi về hướng đông, và có thể có một ga tàu nằm giữa hai tuyến đường.
Có ba loại khối:
- Khối loại C chứa một ga tàu mà bạn phải đi vào từ tuyến phía bắc và đi ra tuyến phía nam.
- Khối loại D chứa một ga tàu mà bạn phải đi vào từ tuyến phía nam và đi ra tuyến phía bắc.
- Khối loại trống không chứa ga tàu.
Ví dụ, trong hình dưới đây, các khối 0, 4 và 6 thuộc loại trống, các khối 1, 2 và 3 thuộc loại C, còn khối 5 thuộc loại D. Các khối nối với nhau theo chiều ngang. Các tuyến tương ứng của hai khối liền kề được nối bởi các điểm nối, được minh họa bằng những hình chữ nhật tô mờ.
Hệ thống có \(n\) ga tàu, được đánh số từ \(0\) đến \(n-1\). Có thể giả thiết rằng ta có thể đi từ bất kỳ ga tàu nào đến bất kỳ ga tàu nào khác bằng cách đi theo tuyến đường. Ví dụ, để đi từ ga 0 đến ga 2, ta xuất phát từ khối 2, đi qua các khối 3 và 4 theo tuyến phía nam, đi qua ga 1 ở khối 5, rồi đi qua khối 4 theo tuyến phía bắc và cuối cùng đến ga 2 ở khối 3.
Vì có thể có nhiều đường đi, khoảng cách từ một ga đến một ga khác được định nghĩa là số lượng nhỏ nhất các điểm nối mà đường đi phải đi qua. Trong ví dụ, đường đi ngắn nhất từ ga 0 đến ga 2 đi qua các khối sau:
2-3-4-5-4-3
Đường đi này đi qua 5 điểm nối, nên khoảng cách là 5.
Hệ thống đường tàu được quản lý bởi máy tính. Không may, sau một sự cố mất điện, máy tính không còn biết các ga nằm ở đâu và nằm trong loại khối nào. Manh mối duy nhất còn lại là số thứ tự của khối chứa ga 0; khối này luôn thuộc loại C. May mắn là máy tính vẫn có thể truy vấn khoảng cách từ một ga bất kỳ đến một ga bất kỳ khác. Chẳng hạn, truy vấn “Khoảng cách từ ga 0 đến ga 2 là bao nhiêu?” sẽ nhận được giá trị 5.
Nhiệm vụ
Bạn cần cài đặt hàm findLocation(n, first, location, stype) để xác định số thứ tự khối và loại khối chứa mỗi ga tàu.
n: số lượng ga tàu.first: số thứ tự khối chứa ga 0.location: mảng độ dài \(n\); bạn cần gán số thứ tự khối chứa ga \(i\) vàolocation[i].stype: mảng độ dài \(n\); bạn cần gán loại khối chứa ga \(i\) vàostype[i]:1cho loại C và2cho loại D.
Bạn có thể gọi hàm getDistance(i, j) để xác định vị trí và loại khối của các ga. Hàm trả về khoảng cách từ ga i đến ga j. getDistance(i, i) trả về 0. getDistance(i, j) trả về -1 nếu i hoặc j nằm ngoài phạm vi từ \(0\) đến \(n-1\).
Các subtasks
Trong tất cả các subtasks, số khối \(m\) không lớn hơn \(1\,000\,000\). Một số subtasks giới hạn số lần gọi getDistance; giới hạn tùy thuộc subtask. Chương trình nhận kết quả wrong answer nếu vượt quá giới hạn này.
| Subtask | Điểm | Giới hạn \(n\) | Số lần gọi getDistance tối đa |
Điều kiện bổ sung |
|---|---|---|---|---|
| 1 | 8 | \(1 \le n \le 100\) | Không hạn chế | Tất cả các ga, trừ ga 0, đều nằm trong khối loại D. |
| 2 | 22 | \(1 \le n \le 100\) | Không hạn chế | Tất cả các ga phía đông (bên phải) ga 0 nằm trong khối loại D; tất cả các ga phía tây (bên trái) ga 0 nằm trong khối loại C. |
| 3 | 26 | \(1 \le n \le 5\,000\) | \(n(n-1)/2\) | Không có điều kiện bổ sung. |
| 4 | 44 | \(1 \le n \le 5\,000\) | \(3(n-1)\) | Không có điều kiện bổ sung. |
Chi tiết cài đặt
Bạn phải nộp đúng một tệp có tên rail.c, rail.cpp hoặc rail.pas, cài đặt findLocation theo đặc tả trên và chữ ký dưới đây. Với C/C++, bạn phải nạp tệp tiêu đề rail.h.
C/C++:
void findLocation(int n, int first, int location[], int stype[]);
Pascal:
procedure findLocation(n, first : longint; var location,
stype : array of longint);
Hàm getDistance có chữ ký như sau.
C/C++:
int getDistance(int i, int j);
Pascal:
function getDistance(i, j: longint): longint;
Trình chấm mẫu
Trình chấm mẫu đọc dữ liệu theo định dạng:
- Dòng 1: số thứ tự subtask.
- Dòng 2:
n. - Dòng \(3+i\), với \(0 \le i \le n-1\):
stype[i](1cho loại C,2cho loại D), rồilocation[i].
Khi findLocation trả về, trình chấm mẫu in Correct nếu toàn bộ location[0] ... location[n-1] và stype[0] ... stype[n-1] do chương trình tính được khớp với dữ liệu vào; nếu không khớp, nó in Incorrect.
Kỳ thi:
- IOI 2014 - Ngày 1 (15 Tháng bảy, 2014)

Bình luận