結果
| 問題 | No.2657 Falling Block Game |
| コンテスト | |
| ユーザー |
ゼット
|
| 提出日時 | 2024-03-01 22:50:21 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,013 bytes |
| 記録 | |
| コンパイル時間 | 339 ms |
| コンパイル使用メモリ | 82,264 KB |
| 実行使用メモリ | 93,052 KB |
| 最終ジャッジ日時 | 2024-09-29 14:40:48 |
| 合計ジャッジ時間 | 37,935 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 TLE * 2 |
ソースコード
class segtreemin:
def __init__(self,n):
self.size=1
while self.size<n:
self.size*=2
self.dat=[10**10]*(self.size*2)
def update(self,x,a):
x+=self.size
self.dat[x]=a
while x>1:
x//=2
self.dat[x]=min(self.dat[2*x],self.dat[2*x+1])
def querry(self,u,v):
u+=self.size
v+=self.size
score=10**10
while u<v:
if u&1:
score=min(score,self.dat[u])
u+=1
if v&1:
v-=1
score=min(score,self.dat[v])
u//=2
v//=2
return score
class segtreemax:
def __init__(self,n):
self.size=1
while self.size<n:
self.size*=2
self.dat=[0]*(self.size*2)
def update(self,x,a):
x+=self.size
self.dat[x]=a
while x>1:
x//=2
self.dat[x]=max(self.dat[2*x],self.dat[2*x+1])
def querry(self,u,v):
u+=self.size
v+=self.size
score=0
while u<v:
if u&1:
score=max(score,self.dat[u])
u+=1
if v&1:
v-=1
score=max(score,self.dat[v])
u//=2
v//=2
return score
H,W=map(int,input().split())
A=[input() for i in range(H)]
dp=[0]*W
from bisect import bisect_left
Z=segtreemin(W)
for i in range(W):
Z.update(i,0)
for i in range(H-2,-1,-1):
dp2=[10**10]*W
L=[-1]
for j in range(W):
if A[i][j]=='#':
L.append(j)
L.append(W)
for j in range(W):
if A[i][j]=='#':
continue
pos=bisect_left(L,j)
a=L[pos-1]
b=L[pos]
ans=10**10
l=0
r=W-1
while True:
if l==r:
break
m=(l+r)//2
y=j+m
if y>=b:
y=b-1
score=Z.querry(j,y+1)
if score<=m:
r=m
else:
l=m+1
ans=min(ans,l)
l=0
r=W-1
while True:
if l==r:
break
m=(l+r)//2
y=j-m
if y<=a:
y=a+1
score=Z.querry(y,j+1)
if score<=m:
r=m
else:
l=m+1
ans=min(ans,l)
dp2[j]=ans
dp=dp2[:]
for j in range(W):
Z.update(j,dp[j])
for i in range(W):
print(dp[i])
ゼット