結果
| 問題 | No.5024 魔法少女うなと宝集め |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-02 17:54:15 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,820 bytes |
| 記録 | |
| コンパイル時間 | 180 ms |
| コンパイル使用メモリ | 84,992 KB |
| 実行使用メモリ | 84,864 KB |
| スコア | 1,411,792 |
| 最終ジャッジ日時 | 2026-05-02 17:55:27 |
| 合計ジャッジ時間 | 14,200 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 47 RE * 3 |
ソースコード
import heapq
N, T = map(int, input().split())
ps = []
A = []
for y in range(N):
row = list(map(int, input().split()))
for x,v in enumerate(row):
ps.append((v,(y,x)))
A.append(row)
ps = sorted(ps)[::-1]
class UF:
def __init__(self,N):
self.v = [i for i in range(N)]
def root(self,x):
if self.v[x]==x:
return x
else:
t = self.root(self.v[x])
self.v[x] = t
return t
def union(self,a,b):
self.v[self.root(a)] = self.root(b)
def same(self,a,b):
return self.root(a) == self.root(b)
def solve(k):
n = N
ts = [v[1] for v in ps[:k]]
# print(ts[:10])
# gen dss
dss = []
for s in range(k):
for t in range(s):
(fy,fx) = ts[s]
(ty,tx) = ts[t]
# print(s,t,(fx,fy))
dss.append(((abs(fx-tx)+abs(fy-ty)),(s,t)))
dss = sorted(dss)
uf = UF(k)
gone = [[False for y in range(n)] for x in range(n)]
en = [0 for _ in range(k)]
for (y,x) in ts:
gone[y][x] = True
logs = []
for _,(s,t) in dss:
if uf.same(s,t):
continue
if en[s] >= 2 or en[t] >= 2:
continue
uf.union(s,t)
en[s] += 1
en[t] += 1
ng = [[a for a in v] for v in gone]
(sy,sx) = ts[s]
bfs = [(0,0,[(sy,sx)],(sy,sx))]
heapq.heapify(bfs)
def search():
# print(ts[s],ts[t])
while len(bfs)>0:
l,c,log,(y,x) = heapq.heappop(bfs)
for dy,dx in [(1,0),(-1,0),(0,1),(0,-1)]:
ty = y + dy
tx = x + dx
if ty<0 or tx<0 or n<=ty or n<=tx:
continue
if (ty,tx) == ts[t]:
return log+[(ty,tx)]
if ng[ty][tx]:
continue
ng[ty][tx] = True
td = (l+1,c-A[ty][tx],log+[(ty,tx)],(ty,tx))
heapq.heappush(bfs,td)
v = search()
if v is not None:
for (y,x) in v:
gone[y][x] = True
# print(s,t,v)
logs.append(v)
src = None
dst = None
for i in range(k):
if en[i] == 1:
dst = src
src = ts[i]
# print(src,dst)
if any(map(lambda v: v is None, logs)):
return None
p = src
res = [src]
while True:
for i in range(len(logs)):
if p in logs[i]:
nl = logs[i]
logs[i] = []
if nl[-1]==p:
nl = nl[::-1]
assert(nl[0] == p)
res += nl[1:]
p = nl[-1]
if p == dst:
break
# print(res)
if len(res)<=T:
return res
return None
# exit()
# print(dss[:10],ts[3],ts[1])
# exit()
def main():
# return solve(5)
l = 0
r = T
while (r-l>1):
m = (l+r)//2
# print(m)
d = solve(m)
if d is None:
r = m
else:
l = m
ans = solve(l)
# print(l,ans)
return ans
path = main()
print(len(path))
for i, j in path:
print(i, j)