--- title: Run Road Solution --- $\Huge\text{Run Road Solution}$ ---------- :::info 🔗 Links: 📌 Tags: `math` `graph` ✍ Writer: Hoàng Việt 📄 Content: [TOC] ::: --------- ## Thuật toán Thay vì tính tổng giá trị độ dài của tất cả các vòng chạy có độ cao vòng chạy đúng bằng $t$, hãy tính tổng giá trị độ dài của tất cả các vòng chạy có độ cao vòng chạy bé hơn hoặc bằng $t$. Gọi $f(val)$ là tổng giá trị độ dài của tất cả các vòng chạy có độ cao vòng chạy bé hơn hoặc bằng $val$. Kết quả sẽ là $f(t) - f(t - 1)$. Để tính $f(val)$: Ta sẽ xây dựng lại một đồ thị mới gồm các cạnh $(u, v)$ mà độ cao của đỉnh $u$ và đỉnh $v$ đều bé hơn hoặc bằng $val$. Xét tất cả các cạnh $(u, v)$ trong đồ thị mới, số lần được tính vào kết quả sẽ là số bộ ba $(x, y, z)$ mà có đi qua cạnh đó. Khi cắt cạnh $(u, v)$ ra khỏi đồ thị mới: - Gọi $S_1$ là số lượng đỉnh cùng thành phần liên thông với $u$ - Gọi $S_2$ là số lượng đỉnh cùng thành phần liên thông với $v$ Xét 2 trường hợp: - Trong bộ ba $(x, y, z)$ có 2 đỉnh cùng thành phần liên thông với $u$ và 1 đỉnh cùng thành phần liên thông với $v$. Số lượng bộ ba thuộc trường hợp này là $C_{S_1}^2$ * $S_2$. - Trong bộ ba $(x, y, z)$ có 1 đỉnh cùng thành phần liên thông với $u$ và 2 đỉnh cùng thành phần liên thông với $v$. Số lượng bộ ba thuộc trường hợp này là $C_{S_2}^2$ * $S_1$. Trong cả hai trường hợp này thì cạnh $(u, v)$ đều được tính vào kết quả hai lần. Vậy với mỗi cạnh $(u, v)$ thì cộng thêm một lượng $C_{S_1}^2$ * $S_2$ * $2$ + $C_{S_2}^2$ * $S_1$ * $2$ vào $f(val)$. Ta có thể dễ dàng tính $S_1$ và $S_2$ bằng cách $DFS$ với mỗi thành phần liên thông để tính trước mảng $sum$ với $sum_u$ là số lượng đỉnh trong cây con gốc $u$. Và khi xét tới cạnh $(u, v)$ với $v$ là cha của $u$ thì $S_1$ = $sum_u$ và $S_2$ = $NumNode - sum_u$ với $NumNode$ số lượng đỉnh trong thành phần liên thông đó. Độ phức tạp $O(N)$. ----------------- Tham khảo code mẫu ở [đây](https://ideone.com/xh62NG).