結果

問題 No.2563 色ごとのグループ
ユーザー Kemty
提出日時 2023-12-02 15:02:09
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 343 ms / 2,000 ms
コード長 2,611 bytes
コンパイル時間 237 ms
コンパイル使用メモリ 82,304 KB
実行使用メモリ 134,144 KB
最終ジャッジ日時 2024-09-26 17:56:36
合計ジャッジ時間 7,803 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 35
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

from collections import defaultdict, deque, Counter
import copy
from itertools import combinations, permutations, product, accumulate, groupby, chain
from heapq import heapify, heappop, heappush
import math
import bisect
from pprint import pprint
from random import randint
import sys
# sys.setrecursionlimit(200000)
input = lambda: sys.stdin.readline().rstrip('\n')
inf = float('inf')
mod1 = 10**9+7
mod2 = 998244353
def ceil_div(x, y): return -(-x//y)
#################################################
class UnionFind:
#
def __init__(self, n):
self.n = n
self.parents = [-1]*n
#x調+
def find(self, x):
if self.parents[x] < 0:
return x
else:
self.parents[x] = self.find(self.parents[x])
return self.parents[x]
#x,y()
#True, False
def union(self, x, y):
x = self.find(x)
y = self.find(y)
if x == y:
return False
if self.parents[x] > self.parents[y]:
x, y = y, x
self.parents[x] += self.parents[y]
self.parents[y] = x
return True
#x
def size(self, x):
return -self.parents[self.find(x)]
#x,y
def same(self, x, y):
return self.find(x) == self.find(y)
#x
def members(self, x):
root = self.find(x)
return [i for i in range(self.n) if self.find(i) == root]
#
def roots(self):
return [i for i, x in enumerate(self.parents) if x < 0]
#
def group_count(self):
return len(self.roots())
#
def get_groups(self):
groups = defaultdict(list)
for x in range(self.n):
groups[self.find(x)].append(x)
return groups
#print()
def __str__(self):
return '\n'.join('{}:{}'.format(r, self.menbers(r)) for r in self.roots())
N, M = map(int, input().split())
C = list(map(int, input().split()))
cnt = Counter(C)
s = 0
for v in cnt.values():
s += v-1
uf = UnionFind(N)
for _ in range(M):
a, b = map(int, input().split())
a -= 1; b -= 1
if C[a] == C[b]:
s -= uf.union(a, b)
print(s)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0