canuc80k3300·1/50

Tổng Khoảng Cách Từ Mỗi Điểm

Nộp bài trên LQDOJ

Bài 33 · Rerooting DP

Một mạng lưới gồm điểm được nối bởi đoạn hai chiều sao cho giữa hai điểm bất kỳ luôn có đúng một đường đi. Độ dài của một đường đi là số đoạn mà đường đi ấy sử dụng.

Với mỗi điểm , hãy tính tổng độ dài đường đi từ đến tất cả điểm của mạng lưới. Khoảng cách từ đến chính nó bằng .

Input

  • Dòng đầu chứa số nguyên .
  • Mỗi dòng trong dòng tiếp theo chứa hai số nguyên và , cho biết có một đoạn nối hai chiều giữa hai điểm đó.

Output

  • In số nguyên trên một dòng. Số thứ là tổng khoảng cách từ điểm đến mọi điểm có chỉ số từ đến .

Constraints

  • .
  • và .
  • Các đoạn nối tạo thành một cây.
  • Mỗi giới hạn trên áp dụng cho một test độc lập.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5
1 2
2 3
2 4
4 5

Output

8 5 8 6 9

Giải thích: Từ điểm , các khoảng cách lần lượt là nên tổng bằng . Thực hiện phép cộng tương tự cho bốn điểm còn lại thu được dãy đã in.

Lời giải tóm tắt
  • Phân tích: Chọn đỉnh 1 làm gốc tạm. Gọi sz[u] là số đỉnh trong cây con của u và ans[u] là tổng khoảng cách cần tìm. Tổng tại đỉnh 1 được tính bằng tổng độ sâu của mọi đỉnh.
  • Thuật toán: Duyệt cây để có cha, độ sâu và thứ tự các đỉnh. Quét thứ tự ngược để tính sz. Khi chuyển gốc qua cạnh từ cha u sang con v, sz[v] đỉnh gần hơn một bước còn n-sz[v] đỉnh xa hơn một bước, vì thế ans[v] = ans[u] + n - 2*sz[v].
  • Chứng minh: Cạnh u-v chia cây thành đúng hai phía. Khi gốc chuyển từ u sang v, mọi đỉnh phía v giảm khoảng cách đúng 1, còn mọi đỉnh phía kia tăng đúng 1. Do ans[1] được tính trực tiếp và công thức giữ đúng đáp án qua mỗi cạnh, quy nạp theo thứ tự từ gốc xuống cho thấy mọi ans[u] đều chính xác.
  • Độ phức tạp: Thời gian O(n), bộ nhớ O(n).