Skip to content

DTQG #1 Editorial

15 Nov 2023

Bài 1

Thêm hai thành phố "ảo" tại khoảng cách . Ta cần di chuyển từ thành phố thứ đến thành phố thứ .

Xét quãng đường di chuyển giữa hai thành phố . Ta đang có bình xăng đang chứa lít. Ta xây dựng hàm tính đáp án: .

Giả sử thành phố xăng rẻ nhất giữa hai thành phố là thành phố . Ta biết chắc rằng nên ưu tiên mua xăng ở thành phố nhất. Do đó ta gọi đến . Hàm sẽ trả về số tiền nhỏ nhất và số xăng còn lại (có thể phải mua thêm vừa đủ để đến được ). Sau đó mới lấy số lượng xăng còn lại, giả sử là , để gọi tiếp hàm .

Ta thấy cách làm trên giống mô hình chia để trị, mỗi lần ta chia ra thành . Thực tế ta không duyệt từ đến hay từ đến như chia để trị. Mỗi giá trị , ta chỉ xét duy nhất một lần. Hàm sẽ chỉ mất .

Vậy ĐPT là do ta cần sort và chuẩn bị mảng thưa để tìm min.

Bài 2

Nhận thấy là ta luôn phải ưu tiên những thành phố có giá xăng là . Do đó ta đi tìm cách xây dựng hai mảng:

  • nxt(i, j): trạm xăng thứ sau có giá xăng bằng .
  • cost(i, j): chi phí để di chuyển đến trạm xăng trên.

Gấp đôi mảng và ta cứ nhảy theo sparse table.

Bài 3

Xét , ta thấy rằng để tính đáp án chính xác bằng sẽ rất khó. Do đó ta nghĩ tới việc tính đáp án cho các dãy có độ chênh vênh .

Sắp xếp lại dãy, lúc này độ chênh vênh của dãy luôn là min của hiệu giữa hai phần tử liên tiếp được chọn. Ta gọi là số dãy có độ chênh vệnh nếu xét đến , đã chọn phần tử. Nếu chọn , phần tử liền trước phải là với . Do đó ta có thể dùng hai con trỏ và tổng tiền tố để tối ưu.

Tổng tìm được sẽ là . Ta trừ đi tổng khi tính cho sẽ ra tổng khi độ chênh vênh đúng bằng .