VM 15 Bài 15 - Cắt cây

View as PDF

Submit solution

Points: 1.40 (partial)
Time limit: 1.0s
Memory limit: 512M
Input: stdin
Output: stdout

Problem source:
VM15 - Minh
Problem types
Allowed languages
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Cho một đồ thị dạng cây gồm ~N~ đỉnh, đỉnh thứ ~i~ có trọng số là ~w_i~. Cho ~K~ lần cắt cây (bằng cạnh xóa đi ~1~ cạnh đang có), ta sẽ tạo ra một rừng gồm ~K+1~ cây. Trọng số của một cây được định nghĩa là tổng trọng số các đỉnh trong cây đó.

Bài toán yêu cầu bạn hãy tìm cách cắt cây sao cho trọng số to nhất của các cây là nhỏ nhất.

Input

Dòng đầu tiên gồm ~2~ số ~N~, ~K~ (~K < N~)

Dòng tiếp theo gồm ~N~ số là trọng số của các đỉnh

N-1 dòng tiếp theo, mỗi dòng gồm ~2~ số ~u~, ~v~ mô tả một cạnh của cây

Output

Một số nguyên duy nhất là trọng số bé nhất.

Sample Input

8 2
7 4 3 8 5 7 5 4
2 1
3 1
4 3
5 2
6 1
7 6
8 1

Sample Output

20

Note

  • ~0 \le K < N \le 10^{5}~
  • ~0 < w_{i} \le 10^{4}~
  • Trong ~20\%~ số test, ~N \le 20~
  • Trong ~20\%~ số test tiếp theo, ~N \le 200~
  • Trong ~20\%~ số test tiếp theo, ~N \le 1000~, trọng số các đỉnh bằng ~1~.

Comments

Please read the guidelines before commenting.



  • 2
    pppssslc  commented on June 21, 2025, 2:11 a.m. edit 5

    spoil

    DFS + Tham lam + chặt nhị phân:

    • Gọi các đỉnh con của ~u~ là ~v~.
    • Gọi ~S(u)~ là tổng trọng số cây con gốc ~u~.
    • Gọi số lần cắt đối với mỗi giá trị ~x~ là ~cnt~;
    • Chặt nhị phân giá trị ~x~ trong khoảng từ ~0~ tới ~10^9~.
    • ~cnt ≤ k~ thì giá trị ~x~ thỏa mãn
    • ~x~ càng lớn thì ~cnt~ càng bé → càng dễ thỏa mãn.
    • DFS để tính ~S(u)~.
    • Nếu ~S(u) > x~:
    • Ưu tiên cắt các cạnh ~u, v~ có ~S(v)~ lớn trước.
    • Sau khi cắt cạnh ~u, v~ thì ~S(u) = S(u) - S(v)~.
    • sau mỗi lần cắt thì tăng ~cnt~ lên ~1~.
    • Cắt đến khi ~S(u) ≤ x~ hoặc ~cnt > k~.

    Độ phức tạp: ~O(n*log_2n*30)~