---
author: little
tags: msttn
title: msttn Solution
---
$\Huge\text{msttn Solution}$
-------
:::info
📌 Tags: `binary search` `greedy` `sorting`
✍️ Writer: little
📋 Content:
[TOC]
:::
-----
## Thuật toán
Ta sẽ biến đổi trọng số của mỗi cạnh $(i, j)$ như sau:
$w_i * w_j + t * (w_i + w_j)$ $=$ $w_i * w_j + w_i * t + w_j * t + t^2 - t^2$ $=$ $(w_i + t) * (w_j + t) - t^2$
Ban đầu ta sẽ sắp xếp tăng dần mảng $w$. Nhận xét là ta sẽ luôn luôn chọn đúng $n - 1$ cạnh để tạo cây khung. Với mỗi truy vấn, ta sẽ xét:
- Nếu $w_1 + t \geq 0$ thì ta sẽ nối đỉnh $1$ với $n - 1$ đỉnh còn lại. Kết quả sẽ là: $(w_1 + t) * (pref_n - pref_1 + t * (n - 1)) - t^2 * (n - 1)$
- Nếu $w_n + t < 0$ thì ta sẽ nối đỉnh $n$ với $n - 1$ đỉnh còn lại. Kết quả sẽ là: $(w_n + t) * (pref_{n-1} + t * (n - 1)) - t^2 * (n - 1)$
- Nếu không tồn tại $2$ trường hợp trên thì cách chọn tối ưu của ta sẽ là: nối đỉnh $1$ với đỉnh $n$, chặt nhị phân tìm $ind$ là vị trí trái cùng sao cho $w_{ind} + t \geq 0$. Ta sẽ nối đỉnh $1$ với các đỉnh từ $ind...n-1$ và nối đỉnh $n$ với các đỉnh từ $2...ind-1$.
----
Tham khảo code ở [đây](https://ideone.com/0wmt2v)