canuc80k3116·17/50

Số Màu Trong Mỗi Cây Con

Nộp bài trên LQDOJ

Bài 31 · Euler Tour

Cho một cây gồm đỉnh, gốc tại đỉnh . Mỗi đỉnh được gán một màu ; nhiều đỉnh có thể có cùng màu.

Với từng đỉnh , hãy đếm số giá trị màu khác nhau xuất hiện trong cây con gốc , có tính cả màu của chính .

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa số nguyên .
  • Mỗi dòng trong dòng tiếp theo chứa hai số , biểu diễn một cạnh của cây.

Output

  • In số nguyên trên một dòng. Số thứ là số màu khác nhau trong cây con của đỉnh .

Constraints

  • .
  • .
  • .
  • Các cạnh tạo thành một cây.

Scoring

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

Example

Test 1

Input

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

Output

4 2 3 1 1 2 1 1

Giải thích: Toàn cây dùng bốn màu. Cây con của có các màu nên có hai màu khác nhau; cây con của có các màu nên có ba màu.

Lời giải tóm tắt
  • Nhận xét: Euler preorder biến cây con v thành đoạn [tin[v],tout[v]] của mảng màu. Ta cần trả số giá trị phân biệt cho n đoạn có đầu phải đã biết.
  • Thuật toán: Quét mảng Euler từ trái sang phải. Fenwick tree luôn đặt đúng một dấu 1 tại vị trí xuất hiện cuối cùng của mỗi màu trong prefix hiện tại: trước khi thêm vị trí mới, xóa dấu ở lần xuất hiện trước của màu đó. Khi quét tới tout[v], tổng Fenwick trên [tin[v],tout[v]] là đáp án của v.
  • Chứng minh tính đúng đắn: Với mỗi màu, dấu 1 duy nhất nằm tại lần xuất hiện cuối không vượt đầu phải đang xét. Màu ấy xuất hiện trong đoạn [l,r] khi và chỉ khi dấu đó nằm không nhỏ hơn l. Vì đoạn Euler là đúng cây con, tổng dấu trong đoạn đếm chính xác số màu phân biệt.
  • Độ phức tạp: O(n log n) thời gian và O(n) bộ nhớ.