trang chủ / bài tập / lifeguardsp / lời giải

Nhân viên cứu hộ (Platinum)

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả: huunguyenhuunguyen

Lời giải: Nhân viên cứu hộ (Platinum)

Hướng tiếp cận

Bài toán yêu cầu sa thải đúng K trong N nhân viên sao cho tổng độ dài phần bao phủ của các đoạn còn lại là lớn nhất. Đây là bài toán quy hoạch động trên các đoạn thời gian.

Nhận xét quan trọng

  1. Loại bỏ đoạn bị chứa: Nếu đoạn [li,ri] được chứa hoàn toàn trong đoạn [lj,rj] (tức là ljlirirj), thì xóa [li,ri] không làm mất bao phủ nào. Gọi số đoạn bị chứa là free_removals. Ta dùng chúng ưu tiên để đạt K lần sa thải.

  2. Sau khi lọc: Sắp xếp theo thời điểm bắt đầu và loại bỏ các đoạn bị chứa, tập còn lại b có tính chất đơn điệu: cả điểm đầu lẫn điểm cuối đều tăng nghiêm ngặt.

  3. Giảm bài toán: Sau khi dùng hết free_removals lần sa thải miễn phí, cần sa thải thêm need = K - free_removals đoạn từ tập b.

Thuật toán

Quy hoạch động:

Định nghĩa dp[i][r] = bao phủ tối đa của b[0..i] khi giữ b[i] và sa thải đúng r đoạn từ b[0..i].

Chuyển trạng thái: Với mỗi j<i (đoạn liền trước được giữ):

  • Loại bỏ tất cả b[j+1..i1] (gồm ij1 đoạn), nên r=rj+(ij1).
  • Đóng góp của b[i]:
    • Nếu b[j]b[i] rời nhau (rjli): contrib=rili
    • Nếu chồng lấp: contrib=rirj (vì b đơn điệu, ri>rj)
  • Ta chỉ cần xét ji1need (vì ij1need).

Trường hợp cơ sở: dp[i][i]=rili với ineed (sa thải tất cả b[0..i1]).

Kết quả: maxidp[i][need(M1i)], trong đó ta cũng sa thải M1i đoạn b[i+1..M1].

Độ phức tạp

  • Thời gian: O(NlogN+M·K2) với MN, KN.
    • Trong thực tế, K100 trong các test của USACO, nên phần DP là O(N·K2) rất nhanh.
  • Bộ nhớ: O(N·K)

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0