結果
問題 | No.2696 Sign Creation |
ユーザー | とりゐ |
提出日時 | 2024-03-22 21:58:10 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,299 ms / 2,500 ms |
コード長 | 2,702 bytes |
コンパイル時間 | 238 ms |
コンパイル使用メモリ | 82,312 KB |
実行使用メモリ | 111,692 KB |
最終ジャッジ日時 | 2024-05-17 18:10:55 |
合計ジャッジ時間 | 8,559 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 45 ms
55,616 KB |
testcase_01 | AC | 41 ms
55,424 KB |
testcase_02 | AC | 42 ms
55,260 KB |
testcase_03 | AC | 43 ms
55,112 KB |
testcase_04 | AC | 44 ms
56,180 KB |
testcase_05 | AC | 48 ms
55,432 KB |
testcase_06 | AC | 43 ms
54,928 KB |
testcase_07 | AC | 43 ms
55,180 KB |
testcase_08 | AC | 142 ms
77,628 KB |
testcase_09 | AC | 46 ms
56,040 KB |
testcase_10 | AC | 159 ms
78,512 KB |
testcase_11 | AC | 53 ms
64,572 KB |
testcase_12 | AC | 54 ms
65,028 KB |
testcase_13 | AC | 552 ms
90,156 KB |
testcase_14 | AC | 397 ms
89,572 KB |
testcase_15 | AC | 368 ms
89,620 KB |
testcase_16 | AC | 515 ms
89,808 KB |
testcase_17 | AC | 61 ms
71,092 KB |
testcase_18 | AC | 203 ms
83,008 KB |
testcase_19 | AC | 350 ms
85,776 KB |
testcase_20 | AC | 71 ms
72,928 KB |
testcase_21 | AC | 325 ms
88,620 KB |
testcase_22 | AC | 188 ms
82,676 KB |
testcase_23 | AC | 333 ms
86,460 KB |
testcase_24 | AC | 329 ms
86,108 KB |
testcase_25 | AC | 335 ms
85,888 KB |
testcase_26 | AC | 129 ms
80,272 KB |
testcase_27 | AC | 162 ms
83,296 KB |
testcase_28 | AC | 170 ms
83,416 KB |
testcase_29 | AC | 87 ms
81,580 KB |
testcase_30 | AC | 90 ms
81,556 KB |
testcase_31 | AC | 1,299 ms
111,692 KB |
testcase_32 | AC | 42 ms
55,040 KB |
testcase_33 | AC | 46 ms
61,644 KB |
testcase_34 | AC | 53 ms
65,096 KB |
testcase_35 | AC | 42 ms
55,480 KB |
testcase_36 | AC | 43 ms
55,908 KB |
testcase_37 | AC | 42 ms
55,060 KB |
testcase_38 | AC | 43 ms
54,904 KB |
testcase_39 | AC | 42 ms
56,056 KB |
testcase_40 | AC | 42 ms
54,940 KB |
ソースコード
from collections import defaultdict class UnionFind(): def __init__(self,n): self.n=n self.parents=[-1]*n self.group_count=n def find(self,x): if self.parents[x]<0: return x else: self.parents[x]=self.find(self.parents[x]) return self.parents[x] def union(self,x,y): x=self.find(x) y=self.find(y) if x==y: return if self.parents[x]>self.parents[y]: x,y=y,x self.parents[x]+=self.parents[y] self.parents[y]=x self.group_count-=1 def size(self,x): return -self.parents[self.find(x)] def same(self,x,y): return self.find(x)==self.find(y) 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 groups(self): group_members=defaultdict(list) for member in range(self.n): group_members[self.find(member)].append(member) return group_members from collections import deque H,W,N,D=map(int,input().split()) mat=[[-1]*W for i in range(H)] xy=[] for i in range(N): x,y=map(lambda x:int(x)-1,input().split()) mat[x][y]=i xy.append([x,y]) dxdy=[(1,0),(0,1),(-1,0),(0,-1)] uf=UnionFind(N) seen=[[-1]*W for i in range(H)] for i in range(N): x,y=xy[i] todo=deque() todo.append([0,x,y]) while todo: d0,x0,y0=todo.popleft() if mat[x0][y0]!=-1: uf.union(i,mat[x0][y0]) if d0==D: continue for dx,dy in dxdy: nx,ny=x0+dx,y0+dy if 0<=nx<H and 0<=ny<W: if seen[nx][ny]!=i: seen[nx][ny]=i todo.append([d0+1,nx,ny]) g=uf.groups() seen=[[-1]*W for i in range(H)] cnt=[[0]*W for i in range(H)] cnt2=[[0]*W for i in range(H)] mark=[[0]*W for i in range(H)] sz=0 for i in g: if len(g[i])>1: sz+=1 todo=deque() for j in g[i]: x,y=xy[j] todo.append([0,x,y]) while todo: d0,x0,y0=todo.popleft() if d0==D: continue for dx,dy in dxdy: nx,ny=x0+dx,y0+dy if 0<=nx<H and 0<=ny<W: if seen[nx][ny]!=i: seen[nx][ny]=i cnt[nx][ny]+=1 if len(g[i])!=1: cnt2[nx][ny]+=1 todo.append([d0+1,nx,ny]) if len(g[i])==1: mark[nx][ny]=1 mn=1<<30 mx=-1 for x in range(H): for y in range(W): if mat[x][y]==-1: if cnt[x][y]==0: mn=min(mn,sz) mx=max(mx,sz) else: if cnt[x][y]==1: if mark[x][y]==1: mx=max(mx,sz+1) mn=min(mn,sz+1) else: mx=max(mx,sz) mn=min(mn,sz) else: mx=max(mx,sz-cnt2[x][y]+1) mn=min(mn,sz-cnt2[x][y]+1) print(mn,mx)