卬高杯
提出id | 提出時刻 | ユーザー名 | 問題 | 言語 | 判定状況 | 判定 | 実行時間 |
---|---|---|---|---|---|---|---|
114826 | 2023-10-24 08:37:42 | hiikunZ | J | python | 11/11 | RE | 86 |
# 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