淡々

プログラミング関連を中心に、様々なことを適当に書きます

【競プロ典型90問】012 - Red Painting(★4)

概要・感想

H x Wのマス目の上でUnionFindを行うという問題。問題の解法すぐに浮かんだが、ソラでUnionFindを書こうとしたら思いのほかバグを発生させてしまい、時間がかかった。

具体的には、UnionFind.merge()内のif a==b:部分を書き忘れていてどこが間違っているのかわからなかった。

import sys
sys.setrecursionlimit(10**7)

class UnionFind:
    def __init__(self, n):
        self.p = [-1] * n
    def parent(self, a):
        if self.p[a] < 0:
            return a
        else:
            self.p[a] = self.parent(self.p[a])
            return self.p[a]
    def is_same(self, a, b):
        a = self.parent(a)
        b = self.parent(b)
        return a == b
    def merge(self, a, b):
        a = self.parent(a)
        b = self.parent(b)
        if a == b:
            return
        if self.p[a] > self.p[b]:
            a, b = b, a
        self.p[a] += self.p[b]
        self.p[b] = a

h, w = map(int, input().split())
M = 2200
uf = UnionFind(M * M)
qn = int(input())

col = [0] * (M * M)
dd = [M, -M, 1, -1]


for _ in range(qn):
    q = list(map(int, input().split()))
    if q[0] == 1:
        x = q[1] * M + q[2]
        col[x] = 1
        for d in dd:
            if col[x+d] == 1:
                uf.merge(x, d + x)
    else:
        x = q[1] * M + q[2]
        y = q[3] * M + q[4]
        print('No' if not uf.is_same(x, y) or col[x] == 0 else 'Yes')