IOI 2026 Ngày 1 Bài 2 - Monuments
Xem PDFQuảng trường Registan nổi tiếng ở Samarkand có \(N\) di tích được xếp thành một hàng chạy ngang qua trung tâm quảng trường. Các di tích được đánh số từ \(0\) đến \(N - 1\). Cột mốc \(i\) (với \(0 \le i < N\)) ban đầu nằm ở tọa độ nguyên \(X[i]\). Tâm của quảng trường nằm ở tọa độ \(0\).
Các kiến trúc sư yêu cầu sự đối xứng hoàn hảo so với tâm. Họ muốn di chuyển một số (có thể là không) di tích sao cho bố cục cuối cùng đối xứng qua tọa độ \(0\). Một cách hình thức:
- Mỗi di tích phải được đặt tại các tọa độ nguyên.
- Mỗi tọa độ nguyên có thể chứa không, một hoặc nhiều di tích.
- Đối với mọi số nguyên \(x > 0\), số lượng di tích tại tọa độ \(x\) phải bằng số lượng di tích tại tọa độ \(-x\). Bất kỳ số lượng di tích nào (có thể là không) đều có thể được đặt tại tọa độ \(0\).
Tuy nhiên, có \(M\) di tích là những di tích cổ xưa và rất dễ hỏng nên không thể di dời. Chỉ số của chúng là \(P[0], P[1], \ldots, P[M - 1]\). \(M\) di tích này phải được giữ nguyên tại tọa độ ban đầu. \(N - M\) di tích còn lại có thể được di dời đến bất kỳ tọa độ nguyên nào. Các di tích không gây cản trở lẫn nhau trong quá trình di chuyển.
Chi phí để di dời một di tích từ tọa độ \(a\) đến tọa độ \(b\) là độ chênh lệch tuyệt đối \(\lvert a - b \rvert\). Tổng chi phí là tổng của tất cả các chi phí di chuyển các di tích.
Nhiệm vụ của bạn là tìm tổng chi phí di chuyển nhỏ nhất để các vị trí của các di tích đối xứng qua tọa độ \(0\), hoặc xác định rằng không thể đạt được sự đối xứng như vậy với các ràng buộc đã cho.
Chi tiết cài đặt
Bạn cần cài đặt hàm sau:
long long get_cost(std::vector<int> X, std::vector<int> P)
- \(X\): Một mảng sắp xếp không giảm có độ dài \(N\) mô tả tọa độ ban đầu của các di tích.
- \(P\): Một mảng sắp xếp tăng ngặt có độ dài \(M\) mô tả các chỉ số của các di tích cổ.
- Hàm này được gọi đúng một lần cho mỗi trường hợp test.
Hàm phải trả về một số nguyên: tổng chi phí ít nhất để làm cho các vị trí trở nên đối xứng, hoặc \(-1\) nếu điều đó là không thể.
Các ràng buộc
- \(1 \le N \le 500\,000\).
- \(0 \le M \le N\).
- \(-10^9 \le X[0] \le X[1] \le \ldots \le X[N - 1] \le 10^9\).
- \(0 \le P[0] < P[1] < \ldots < P[M - 1] < N\).
Các subtask
| Subtask | Điểm | Các ràng buộc thêm |
|---|---|---|
| 1 | 3 | \(M = N\) |
| 2 | 4 | \(M = 0\) |
| 3 | 5 | \(X[P[j]] < 0\) với mỗi \(j\) sao cho \(0 \le j < M\). |
| 4 | 6 | \(N \le 10\) |
| 5 | 5 | \(N \le 19\) |
| 6 | 5 | \(N \le 32\) |
| 7 | 13 | \(N \le 200\) |
| 8 | 17 | \(N \le 4000\) |
| 9 | 13 | \(M \le 4000\) |
| 10 | 29 | Không có ràng buộc nào thêm. |
Các ví dụ
Ví dụ 1
Xét lời gọi hàm sau:
get_cost([-3, -2, 1, 3], [1, 2])
Vị trí ban đầu của các di tích được thể hiện trong hình dưới đây.
Có \(N = 4\) di tích, ban đầu nằm tại các tọa độ \([-3, -2, 1, 3]\). Các chỉ số của các di tích cổ là \(P[0] = 1\) và \(P[1] = 2\). Tức là, các di tích tại các tọa độ \(X[P[0]] = -2\) và \(X[P[1]] = 1\) không thể di chuyển. Các di tích còn lại tại các tọa độ \(-3\) và \(3\) có thể được di chuyển.
Để đạt được tính đối xứng với tổng chi phí nhỏ nhất, ta nên di chuyển các di tích như sau:
- Di chuyển di tích từ tọa độ \(-3\) đến \(-1\), với chi phí là \(\lvert (-3) - (-1) \rvert = 2\).
- Di chuyển di tích từ tọa độ \(3\) đến \(2\), với chi phí là \(\lvert 3 - 2 \rvert = 1\).
Sau các thao tác di chuyển này, vị trí các di tích trở nên đối xứng.
Tổng chi phí di chuyển là \(2 + 1 = 3\), do đó hàm cần trả về \(3\).
Ví dụ 2
Xét lời gọi hàm sau:
get_cost([2, 2, 2, 3], [])
Trong đó, \(M = 0\), có nghĩa là không có di tích nào là cổ xưa, và tất cả các di tích đều có thể được di dời. Một giải pháp có tổng chi phí tối thiểu là di dời tất cả các di tích đến tọa độ \(0\). Chi phí cho mỗi di tích là:
- \(\lvert 2 - 0 \rvert = 2\) đối với các di tích \(0\), \(1\) và \(2\).
- \(\lvert 3 - 0 \rvert = 3\) đối với di tích \(3\).
Tổng chi phí là \(2 + 2 + 2 + 3 = 9\). Do đó, thủ tục cần trả về \(9\). Lưu ý rằng có các giải pháp khác có cùng tổng chi phí.
Ví dụ 3
Xét lời gọi hàm sau:
get_cost([1, 2, 3, 4], [0, 1, 2, 3])
Tất cả \(4\) di tích đều là di tích cổ và không thể di dời. Vì tọa độ của chúng đều là số dương, nên không thể tạo ra một cấu hình đối xứng qua trục \(0\). Do đó, hàm cần trả về kết quả là \(-1\).
Trình chấm mẫu
Định dạng dữ liệu vào:
N M
X[0] X[1] ... X[N-1]
P[0] P[1] ... P[M-1]
Lưu ý rằng dòng thứ ba có thể trống nếu \(M\) bằng \(0\).
Định dạng kết quả ra:
C
Trong đó, \(C\) là giá trị trả về bởi hàm get_cost.
Nguồn: IOI 2026, Ngày 1 — Monuments (monuments), bản đề chính thức tiếng Việt.
Kỳ thi:
- IOI 2026 — Day 1 (14 Tháng 8., 2026)


Bình luận