秋祭 | 静岡高校工学部



卬高杯


提出詳細

提出id提出時刻ユーザー名問題言語判定状況判定実行時間
1148262023-10-24 08:37:42hiikunZJpython11/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)
    u -= 1
    v -= 1
    UF.unite(u, v)

try:
    input()
    assert(False)
except:
    pass

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:
        ans += UF.unite(i, M)
print(ans)

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