結果

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

ソースコード

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 != []]

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
    G[u].append((v, i))
    G[v].append((u, i))

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

if 3 <= K:
    UF = UnionFind(M)
    for n in range(N):
        R = []
        for v, eidx in G[n]:
            l, r = A[n], A[v]
            if l > r: l, r = r, l
            R.append((l, r, eidx))
        R.sort(key=lambda x:x[1])
        stack = []
        for i in range(len(R)):
            a, b, c = R[i]
            while stack and b-stack[-1][1] <= X:
                d, e = stack.pop()
                UF.merge(c, d)
                a = max(a, e)
            stack.append((c, a))
    ans = 0
    for i in range(M):
        if UF.leader(i) == i:
            ans += nC2(UF.size(i)+1)*2-UF.size(i)*2
    for n in range(N):
        for v, _ in G[n]:
            if max(A[n], A[v])-min(A[n], A[v]) <= X:
                ans += 1

    print(ans)
else:
    UF = UnionFind(N)
    for n in range(N):
        for v, _ in G[n]:
            if max(A[n], A[v])-min(A[n], A[v]) <= X:
                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