Tổng đường đi trên cây (LCA)
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.
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.
Hướng tiếp cận
Đây là bài toán truy vấn tổng trọng số đỉnh trên đường đi giữa hai đỉnh trên cây. Ta dùng kỹ thuật tổng tiền tố trên cây kết hợp với LCA (Lowest Common Ancestor).
Nhận xét quan trọng
Gọi là tổng trọng số của các đỉnh trên đường đi từ gốc đến đỉnh (gồm cả ). Với hai đỉnh và :
- Đường là hợp của đường và đường , giao tại đúng đỉnh .
- Tổng = .
Lý do: là tổng các đỉnh từ con của trên đường tới cho đến (không gồm ). Tương tự với . Cộng lại rồi thêm chính là tổng cần tìm.
Thuật toán
- DFS (lặp, dùng stack) từ gốc để tính , , .
- Binary lifting: dựng bảng = tổ tiên thứ của , với . Truy hồi .
- LCA: nâng đỉnh sâu hơn lên cho cùng độ sâu, sau đó nâng đồng thời từng bậc giảm dần đến khi hai con trỏ chỉ vào hai đỉnh có cha chung.
- Trả lời truy vấn bằng công thức trên.
Độ phức tạp
- Tiền xử lý: .
- Mỗi truy vấn: .
- Tổng: , phù hợp với .
Bình luận