CEOI 2025 - Highest

Xem PDF



Dạng bài
Ngôn ngữ cho phép
C++
Điểm: 2600 (p) Thời gian: 2.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Đề bài

Trong một vũ trụ khác, Vlad bị mắc kẹt trong một phiên bản tương lai của pháo đài Poenari gồm \(n\) tầng, được đánh số từ \(0\) đến \(n-1\). Từ mỗi tầng \(i\), Vlad chỉ có thể đi lên theo một trong hai cách:

  • Đi cầu thang, tốn \(1\) giọt máu. Cầu thang từ tầng \(i\) cho phép Vlad đi lên nhiều nhất \(v[i]\) tầng, tức là đến bất kỳ tầng nào từ \(i+1\) đến \(i+v[i]\) mà không vượt quá tầng \(n-1\).
  • Hóa thành dơi và đi qua ống thông gió, tốn \(2\) giọt máu. Ống thông gió từ tầng \(i\) cho phép Vlad đi lên nhiều nhất \(w[i]\) tầng, tức là đến bất kỳ tầng nào từ \(i+1\) đến \(i+w[i]\) mà không vượt quá tầng \(n-1\).

Hai người anh em của Vlad là Radu và Mircea đưa ra \(m\) kịch bản. Mỗi kịch bản gồm hai tầng \(A\)\(B\) với \(A\le B\). Với mỗi kịch bản, hãy tìm số giọt máu ít nhất Vlad phải trả để đi từ tầng \(A\) đến tầng \(B\).

Chi tiết cài đặt

Bạn cần cài đặt hàm sau:

C++
std::vector<int> solve(
    std::vector<int>& v,
    std::vector<int>& w,
    std::vector<std::pair<int, int>>& queries
);
  • v: mảng độ dài \(n\); v[i] là số tầng nhiều nhất cầu thang tại tầng \(i\) có thể đưa Vlad đi lên.
  • w: mảng độ dài \(n\); w[i] là số tầng nhiều nhất hệ thống ống thông gió tại tầng \(i\) có thể đưa Vlad đi lên.
  • queries: mảng độ dài \(m\) gồm các cặp \((A,B)\) như mô tả trong đề.
  • Hàm phải trả về một mảng độ dài \(m\), trong đó phần tử thứ \(i\) là đáp án của truy vấn thứ \(i\).

Ràng buộc

  • \(1\le n,m\le500\,000\).
  • \(1\le v[i],w[i]\le n\) với mọi \(0\le i<n\).
  • \(0\le A\le B\le n-1\) với mọi truy vấn.

Phân nhóm

  • Phân nhóm 1 (5 điểm): \(1\le n\le300\), \(1\le m\le500\,000\).
  • Phân nhóm 2 (7 điểm): \(1\le n\le3\,000\), \(1\le m\le3\,000\).
  • Phân nhóm 3 (11 điểm): \(1\le n\le20\,000\), \(1\le m\le20\,000\).
  • Phân nhóm 4 (44 điểm): \(1\le n\le200\,000\), \(1\le m\le200\,000\).
  • Phân nhóm 5 (8 điểm): \(1\le n,m\le500\,000\); với mọi \(0\le i<j\le n-1\), ta có \(v[i]\le v[j]\)\(w[i]\le w[j]\).
  • Phân nhóm 6 (25 điểm): Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
solve(
    {2, 3, 1, 1, 1, 1, 2},
    {3, 4, 1, 2, 1, 2, 2},
    {{0, 4}, {0, 5}, {0, 6}}
)
Output
{2, 3, 4}
Giải thích

Ở đây \(n=7\).

  • Với truy vấn \((0,4)\), Vlad đi từ \(0\) đến \(1\) với chi phí \(1\), rồi từ \(1\) đến \(4\) với chi phí \(1\). Tổng chi phí là \(2\).
  • Với truy vấn \((0,5)\), có hai đường đi tối ưu: \(0\to1\to4\to5\) với chi phí \(1+1+1=3\), hoặc \(0\to1\to5\) với chi phí \(1+2=3\).
  • Với truy vấn \((0,6)\), một đường đi có chi phí \(4\)\(0\to1\to5\to6\), với chi phí \(1+2+1=4\).

Ví dụ 2

Input
solve(
    {1, 1, 1, 2, 3, 2, 1, 1, 2, 3},
    {2, 4, 1, 4, 1, 4, 1, 3, 2, 3},
    {{3, 9}, {0, 9}, {0, 7}, {0, 4}, {3, 5}}
)
Output
{3, 5, 4, 3, 1}
Giải thích

Các đường đi tối ưu tương ứng là:

  • \((3,9)\): \(3\to5\) với chi phí \(1\), rồi \(5\to9\) với chi phí \(2\); tổng bằng \(3\).
  • \((0,9)\): \(0\to1\) với chi phí \(1\), \(1\to5\) với chi phí \(2\), rồi \(5\to9\) với chi phí \(2\); tổng bằng \(5\).
  • \((0,7)\): \(0\to1\) với chi phí \(1\), \(1\to5\) với chi phí \(2\), rồi \(5\to7\) với chi phí \(1\); tổng bằng \(4\).
  • \((0,4)\): \(0\to1\) với chi phí \(1\), rồi \(1\to4\) với chi phí \(2\); tổng bằng \(3\).
  • \((3,5)\): đi thẳng từ \(3\) đến \(5\) với chi phí \(1\).

Trình chấm mẫu

Trình chấm mẫu đọc dữ liệu theo định dạng sau:

  • Dòng \(1\): \(n\).
  • Dòng \(2\): v[0] v[1] ... v[n-1].
  • Dòng \(3\): w[0] w[1] ... w[n-1].
  • Dòng \(4\): \(m\).
  • Dòng \(5+i\) với \(0\le i<m\): A B của truy vấn thứ \(i\).

Trình chấm mẫu in \(m\) dòng là các phần tử của mảng do solve trả về.

Tệp

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: