Có học sinh và trò chơi vi tính. Mỗi học sinh chỉ thích chơi một trò duy nhất và mỗi trò chơi có ít nhất một học sinh thích. Nhà trường tổ chức kết nối mạng LAN cho các máy trong phút, phút thứ nối máy của học sinh và (coi như đồ thị vô hướng). Tất cả những học sinh thích chơi cùng một loại game sẽ bắt đầu chơi khi máy tính của họ liên thông (có thể đi qua các đỉnh chứa game khác). Hỏi thời gian bắt đầu chơi của mỗi game.
Nếu game chỉ có người thích thì sẽ bắt đầu vào phút thứ
Nếu loại game không thế liên thông sau phút thì in ra ứng với game đó
Dòng : , , tương ứng với số học sinh, số trò chơi, số phút (mỗi phút nối dây LAN)
Dòng : Gồm số miêu tả trò chơi mà học sinh thứ thích
dòng tiếp theo: mỗi dòng gồm số và
Gồm dòng, dòng thứ là thời điểm bắt đầu chơi của game thứ
, .
Với mỗi màu trong , ta có thể chặt nhị phân đáp án. Giả sử chặt nhị phân số là số cạnh, ta tạo đồ thị từ cạnh đầu tiên trong tập cạnh, và đếm số đỉnh có màu trong thành phần liên thông tạo ra.
Sử dụng map, với ý nghĩa : chứa toàn bộ màu và số lượng màu đó trong thành phần liên thông chứa đỉnh
Trường hợp đặc biệt: Nếu màu chỉ có một đỉnh là có chứa màu đó, thì
Đối với trường hợp màu có nhiều hơn một đỉnh:
Cách làm thông thường với DSU là với mỗi cạnh và , ta kiểm tra đỉnh này có cùng thành phần liên thông hay không, nếu không cùng thành phần liên thông, ta có thể hợp thành phần liên thông lại, bằng cách thêm toàn bộ màu và số lượng màu đó của thành phần liên thông chứa đỉnh sang thành phần liên thông chứa đỉnh .
Sau khi hợp màu nào đó từ thành phần lại khiến số màu của trong thành phần liên thông bằng số lượng đỉnh có màu ở đồ thị ban đầu, thì bước hợp cạnh thứ vừa rồi chính là kết quả cho màu . Tuy nhiên lưu ý sẽ có trường hợp thành phần chứa đủ màu, thành phần chứa không có màu , thì chứng tỏ trước đó chúng ta đã có kết quả cho màu rồi.
Trường hợp xấu nhất đối với cách làm trâu phía trên, là với mỗi cạnh, thành phần chứa có một đỉnh, thành phần chứa bao gồm mọi đỉnh của cạnh phía trước, vậy số lần chuyển màu từ thành phần chứa sang thành phần chứa có độ phức tạp xấu nhất là và bộ nhớ là . Vậy trường hợp xấu nhất của cả bài toán có thể khiến bộ nhớ lên đến .
Vì vậy chúng ta sẽ chỉ hợp màu từ thành phần nhỏ hơn sang thành phần lớn hơn, như vậy độ phức tạp bộ sẽ giảm xuống chỉ còn , và độ phức tạp thời gian là
Từ thuật trâu sử dụng binary search phía trên, ta biết rằng với mỗi màu , chỉ cần không dùng quá bước để tìm ra kết quả. Với lần thứ sử dụng cạnh, ta sẽ tìm ra được một bộ tương ứng với màu thứ . Vì vậy ta có thể làm theo tư tưởng của chặt nhị phân song song, sau mỗi một lần dùng cạnh, ta sẽ tìm ra bộ với mọi màu .
Với code của bài này mình sử dụng style chặt nhị phân () nên điều kiện dừng sẽ là nếu không tồn tại màu nào có thì sẽ dừng việc xử lý lại.
Đầu tiên, gọi là vector chứa các màu có thể có kết quả là . Ta sẽ xử lý theo từng cạnh từ đến , với mỗi cạnh đó, ta sẽ nối thành phần chứa tương ứng vào nhau.
Sau đó, ta sẽ kiểm tra các màu nào có thể có kết quả (nằm trong vector )
Để kiểm tra mọi đỉnh có màu có thuộc cùng thành phần liên thông hay không, ta sẽ dùng DSU, lưu các đỉnh có màu vào trong vector , sau đó lấy ra gốc của các đỉnh này, nếu mọi gốc đều bằng nhau, chứng tỏ màu đã cùng thành phần liên thông, ta gán , ngược lại gán
Sau khi dừng việc xử lý, in ra tương ứng chính là kết quả cho từng màu.