結果
| 問題 |
No.2696 Sign Creation
|
| コンテスト | |
| ユーザー |
ゼット
|
| 提出日時 | 2024-03-22 22:53:41 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,074 bytes |
| コンパイル時間 | 445 ms |
| コンパイル使用メモリ | 82,260 KB |
| 実行使用メモリ | 595,300 KB |
| 最終ジャッジ日時 | 2024-12-20 12:20:03 |
| 合計ジャッジ時間 | 24,250 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 36 TLE * 1 MLE * 1 |
ソースコード
class unif:
def __init__(self,n):
self.pare=[-1]*n
self.size=[1]*n
def root(self,x):
while self.pare[x]!=-1:
x=self.pare[x]
return x
def unite(self,u,v):
rootu=self.root(u)
rootv=self.root(v)
if rootu!=rootv:
if self.size[rootu]>=self.size[rootv]:
self.pare[rootv]=rootu
self.size[rootu]+=self.size[rootv]
else:
self.pare[rootu]=rootv
self.size[rootv]+=self.size[rootu]
def same(self,s,t):
return self.root(s)==self.root(t)
H,W,N,D=map(int,input().split())
C=set()
A=[{} for i in range(2*(H+1))]
T={}
L=[]
for i in range(N):
x,y=map(int,input().split())
L.append((x,y))
T[x*10**10+y]=i
Z=unif(N)
for i in range(N):
x,y=L[i][:]
for dx in range(-D,D+1):
k=D-abs(dx)
for dy in range(-k,k+1):
x2,y2=x+dx,y+dy
if x2<=0 or x2>=H+1 or y2<=0 or y2>=W+1:
continue
w=x2*10**10+y2
if w in T:
pos=T[w]
Z.unite(i,pos)
count=0
b=set()
for i in range(N):
p=Z.root(i)
if Z.size[p]>1:
b.add(p)
count=len(b)
h=[]
u=[0]*N
t=[0]*N
for i in range(N):
p=Z.root(i)
k=Z.size[p]
u[i]=p
t[i]=k
ans1=10**10
ans2=-10**10
used=0
D2=[set() for i in range(4*10**6)]
e={}
f=[0]*(4*10**6)
for i in range(N):
x,y=L[i][:]
for dx in range(-D,D+1):
k=D-abs(dx)
for dy in range(-k,k+1):
x2,y2=x+dx,y+dy
if x==x2 and y==y2:
continue
if x2<=0 or x2>=H+1 or y2<=0 or y2>=W+1:
continue
n=t[i]
pos=u[i]
w=x2*10**10+y2
if not w in e:
e[w]=used
D2[used].add(pos)
used+=1
if w in T:
f[used-1]=0
else:
f[used-1]=1
else:
p=e[w]
D2[p].add(pos)
if used<H*W:
ans1=min(ans1,count)
ans2=max(ans2,count)
for i in range(used):
c=0
k=0
if f[i]==0:
continue
for pos in D2[i]:
if Z.size[pos]==1:
c=1
else:
k+=1
if k==0 and c==1:
ans1=min(ans1,count+1)
ans2=max(ans2,count+1)
else:
ans1=min(ans1,count+1-k)
ans2=max(ans2,count+1-k)
print(ans1,ans2)
ゼット