秋祭 | 静岡高校工学部



卬高杯


提出詳細

提出id提出時刻ユーザー名問題言語判定状況判定実行時間
1148332023-10-24 08:41:34hiikunZJpython11/11RE86

# UnionFind
class UnionFind:
    def __init__(self, n):
        self.par = [-1] * n
        self.S = n
    def root(self, A):
        if self.par[A] < 0:
            return A
        self.par[A] = self.root(self.par[A])
        return self.par[A]
    def same(self, A, B):
        return self.root(A) == self.root(B)
    def unite(self, A, B):
        a = self.root(A)
        b = self.root(B)
        if a == b:
            return False
        if self.par[a] > self.par[b]:
            a, b = b, a
        self.par[a] += self.par[b]
        self.par[b] = a
        self.S -= 1
        return True
    def size(self, A):
        return -self.par[self.root(A)]
    def size(self):
        return self.S

# main
N, M, X, P = map(int, input().split())
B = list(map(int, input().split()))
T = list(map(int, input().split()))
assert(1 <= N and N <= 100)
assert(1 <= M and M <= 100000)
assert(1 <= X and X <= 100000)
assert(1 <= P and P <= 1000000000)
assert(len(B) == N)
assert(len(T) == M)
for i in range(N):
    assert(1 <= B[i] and B[i] <= 1000000000)
for i in range(M):
    assert(1 <= T[i] and T[i] <= 1000000000)
UF = UnionFind(M + 100)
for i in range(X):
    u, v = map(int, input().split())
    assert(1 <= u and u <= M)
    assert(1 <= v and v <= M)
    u -= 1
    v -= 1
    UF.unite(u, v)

ok = True
try:
    u,v = map(int, input().split())
    ok = False
except:
    pass

assert(ok)

ans = 0
for i in range(M):
    dis = 10**18
    for j in range(N):
        dis = min(dis, abs(B[j] - T[i]))
    if dis <= P:
        if UF.unite(i, M):
            ans += 1
print(ans)

case1.txt AC 18
case2.txt RE 86
case3.txt RE 75
case4.txt RE 74
case5.txt RE 75
case6.txt RE 76
case9.txt RE 77
case10.txt RE 77
case11.txt RE 75
case13.txt RE 75
sample1.txt AC 16
86 RE