結果

問題 No.3517 Snake Kunekune Graph
コンテスト
ユーザー detteiuu
提出日時 2026-05-31 20:15:52
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
WA  
実行時間 -
コード長 2,213 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 128 ms
コンパイル使用メモリ 85,120 KB
実行使用メモリ 162,420 KB
最終ジャッジ日時 2026-05-31 20:16:14
合計ジャッジ時間 20,992 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 30 WA * 15
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

from sys import stdin
input = stdin.readline

class UnionFind:
    def __init__(self,n):
        self.n = n
        self.parent_size = [-1]*n
 
    def leader(self,a):
        if self.parent_size[a] < 0:
            return a
        self.parent_size[a] = self.leader(self.parent_size[a])
        return self.parent_size[a]
 
    def merge(self,a,b):
        x, y = self.leader(a), self.leader(b)
        if x == y:
            return 
        if abs(self.parent_size[x]) < abs(self.parent_size[y]):
            x, y = y, x
        self.parent_size[x] += self.parent_size[y]
        self.parent_size[y] = x
        return 
 
    def same(self,a,b):
        return self.leader(a) == self.leader(b)
 
    def size(self,a):
        return abs(self.parent_size[self.leader(a)])
 
    def groups(self):
        result = [[] for _ in range(self.n)]
        for i in range(self.n):
            result[self.leader(i)].append(i)
        return [r for r in result if r != []]

INF = 1<<60

N, M, X, K = map(int, input().split())
A = list(map(int, input().split()))
G = [[] for _ in range(N)]
for i in range(M):
    u, v = map(int, input().split())
    u, v = u-1, v-1
    if X < abs(A[u]-A[v]): continue
    G[u].append(v)
    G[v].append(u)

def nC2(n):
    return n*(n-1)//2
def nC3(n):
    return n*(n-1)*(n-2)//6

if 3 <= K:
    UF = UnionFind(N*2)
    for n in range(N):
        for v in G[n]:
            if A[n] < A[v]:
                UF.merge(n, v+N)
            else:
                UF.merge(n+N, v)
    for n in range(N):
        MIN, MAX = -INF, INF
        for v in G[n]:
            if A[v] <= A[n]:
                MIN = max(MIN, A[v])
            else:
                MAX = min(MAX, A[v])
        if abs(MIN-MAX) <= X:
            UF.merge(n, n+N)
    GR = UF.groups()
    ans = 0
    for g in GR:
        cnt = 0
        S = set()
        for n in g:
            if n < N:
                S.add(n)
            else:
                S.add(n-N)
        ans += nC2(len(S))*2
    print(ans)
else:
    UF = UnionFind(N)
    for n in range(N):
        for v in G[n]:
            UF.merge(n, v)
    ans = 0
    for i in range(N):
        if UF.leader(i) == i:
            ans += nC2(UF.size(i))*2

    print(ans)
0