from collections import defaultdict class UnionFind: def __init__(self,N,label=None,f=None,weighted=False,rollback=False): self.N=N self.parents=[None]*self.N self.size=[1]*self.N self.roots={i for i in range(self.N)} self.label=label if self.label!=None: self.label=[x for x in label] self.f=f self.weighted=weighted if self.weighted: self.weight=[0]*self.N self.rollback=rollback if self.rollback: self.operate_list=[] self.operate_set=[] def Find(self,x): stack=[] while self.parents[x]!=None: stack.append(x) x=self.parents[x] if not self.rollback: if self.weighted: w=0 for y in stack[::-1]: self.parents[y]=x w+=self.weight[y] self.weight[y]=w else: for y in stack[::-1]: self.parents[y]=x return x def Union(self,x,y,w=None): root_x=self.Find(x) root_y=self.Find(y) if self.rollback: self.operate_list.append([]) self.operate_set.append([]) if root_x==root_y: if self.weighted: if self.weight[y]-self.weight[x]==w: return True else: return False else: if self.size[root_x]>i&1!=bit0>>(i+1)%16&1)>2: continue cnt+=1 for bit1 in range(1<<9): A=[[None]*5 for i in range(5)] for k in range(16): i,j=idx0[k] A[i][j]=bit0>>k&1 for k in range(9): i,j=idx1[k] A[i][j]=bit1>>k&1 UF=UnionFind(25) for i in range(5): for j in range(5): for di,dj in ((0,1),(1,0)): if i+di<5 and j+dj<5 and A[i][j]==A[i+di][j+dj]: UF.Union(i*5+j,(i+di)*5+(j+dj)) if UF.Linked_Components_Count()<=2: S=[0,0] for i in range(5): for j in range(5): S[A[i][j]]+=C[i][j] ans=min(ans,abs(S[0]-S[1])) print(ans)