atcoder F - Pond Skater ABC170
解説によればダイクストラ法とのこと。
一度コストの和ではなくパスを構成する辺の数を返してしまいWA
python
if sys.argv[-1] == 'ONLINE_JUDGE':
from numba.pycc import CC
cc = CC('my_module')
cc.export('main', '(b1[:],i8,i8,i8,i8,i8)')(main)
cc.compile()
exit()
from my_module import main
https://atcoder.jp/contests/abc170/submissions/14405996 なんと。 numbaで事前にコンパイルしてる。
今、直進していけるところまでは進んでる
49 20156497 22145363.0 1.1 11.3 nx += dxこんな状態で1割程度遅いだけとは思えないな?
PyPy3で3314 ms、タイムリミットを1割ほど超過している。(誤解A)
向き変更時の距離の更新が間違ってたバグを直してサブミット、WA
WAの原因は距離が2つの数のタプルになったのに到達不能の判定が1つの数との比較のままだったから。
7.3 (d, frac), (frm, direction) = heappop(queue)
8.5 for dir in range(4):
6.0 if dir == direction:
5.3 if nx < 1 or H < nx or ny < 1 or W < ny:
7.7 dp(nx, ny, mapdata[nx - 1][ny - 1])
5.4 if mapdata[nx - 1][ny - 1] == leaf:
5.7 if distances[to] > newdist:
デバッグプリントの消し忘れはコメントアウトする
4方向から今向いてる方向を取り除いたものを実行してるけど、このループは砕いた方がいいかも。
トータル実行時間が80秒から27秒になった。サブミットしてみよう。
11.1 (d, frac), (frm, direction) = heappop(queue)
- うーん、まあ、そうですよね…
- この辺を直していくの、あんまりやる気が起きないなぁ
numbaを試そう!
inputは型が不明と言われるのでmainの外で読み込んでから渡す
Untyped global name 'input': cannot determine Numba type of <class 'builtin_function_or_method'>マップはどうやって渡してるかな?ああ、なるほど、番兵付きの一次元配列にするのか。
b1[:]Untyped global name 'defaultdict': cannot determine Numba type of <class 'numba.core.ir.UndefinedType'>
Use of unsupported opcode (IMPORT_NAME) found
結局タプルをキーにするのはダメ っぽい
No implementation of function Function(<built-in function setitem>) found for signature:>>> setitem(DictType[Tuple(UniTuple(int64 x 2), int64),UniTuple(int64 x 2)], Tuple(UniTuple(int64 x 2), Literal[int](0)), none)defaultdictをやめたことによるキーエラーはコンパイルした状況ではどこで起きたか分からないので、Pythonモードで実行
'NoneType' object has no attribute 'args'という謎のエラー
辞書からのgetで型がおかしくなるっぽいので、辞書からのgetをしないようにリストで実装し直した
高速化の過程で90度のターンしかしなくなったことにより、初手が真後ろの盤面において1つ多く答えていた
初回だけ5番目の向きにしたが、始状態を90度回転した2つにすればよかっただけかも