canuc80k2301·2/50

Mạng Đường Đang Mở Rộng

Nộp bài trên LQDOJ

Bài 2.4 · Disjoint Set Union

Có địa điểm, ban đầu mỗi địa điểm là một thành phần riêng. Sau đó tuyến đường hai chiều được mở lần lượt. Ngay sau mỗi tuyến đường, cần biết mạng hiện có bao nhiêu thành phần liên thông và thành phần lớn nhất chứa bao nhiêu địa điểm.

Một tuyến đường có thể nối hai địa điểm vốn đã đi tới nhau; khi đó cấu trúc các thành phần không thay đổi.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Mỗi trong dòng tiếp theo chứa hai số nguyên và , mô tả tuyến đường được mở tiếp theo giữa hai địa điểm khác nhau.

Output

  • Sau mỗi tuyến đường, in một dòng gồm hai số: số thành phần liên thông hiện tại và kích thước của thành phần lớn nhất.

Constraints

  • .
  • .
  • và khác ; một cạnh mới có thể nằm trong thành phần đã liên thông.

Scoring

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

Example

Test 1

Input

6 5
1 2
3 4
2 3
1 4
5 6

Output

5 2
4 2
3 4
3 4
2 4

Giải thích: Ba cạnh đầu lần lượt tạo hai cặp rồi hợp chúng thành một thành phần bốn đỉnh, nên các thống kê trở thành . Cạnh nằm trong thành phần đó nên không đổi kết quả; cạnh cuối nối với , để lại hai thành phần và thành phần lớn nhất vẫn có bốn đỉnh.

Lời giải tóm tắt
  • Phân tích: Ngoài đại diện của mỗi thành phần, cần lưu kích thước tại gốc. Một biến components đếm số thành phần và một biến largest lưu kích thước lớn nhất hiện tại.
  • Thuật toán: Với mỗi cạnh (a,b), thử hợp nhất hai gốc. Chỉ khi hai gốc khác nhau mới giảm components và cập nhật largest bằng kích thước gốc mới. Sau đó in hai biến.
  • Chứng minh: DSU biểu diễn đúng các thành phần của các cạnh đã đọc. Cạnh nằm trong một thành phần không thay đổi phân hoạch; cạnh nối hai thành phần biến đúng hai thành phần đó thành một, nên số thành phần giảm một và kích thước mới là tổng hai kích thước. Lấy cực đại sau mọi lần hợp nhất bảo đảm largest luôn đúng.
  • Độ phức tạp: Thời gian O((n+m) alpha(n)), bộ nhớ O(n).