kit84 talks

社会人 / AtCoder 緑 / くBC 水

競プロ典型 90 問 #004 を素の Python で通したけれど、1975 ms で涙目

tl;dr

PyPy を使おう

問題文

競プロ典型 90 問 004 - Cross Sum(★2)(要ログイン・参加登録)

AC コード

import sys
input = sys.stdin.readline

def linput(ty=int, cvt=list):
    return cvt(map(ty,input().split()))

# ...中略...

def main():
    H,W = linput()
    mA = [linput() for _ in range(H)]

    vH = [sum(va) for va in mA]
    vW = [sum(ta) for ta in zip(*mA)]

    mR = []
    for va,h in zip(mA,vH):
        mR.append([h+w-a for a,w in zip(va,vW)])

    for vr in mR:
        print(*vr)


if __name__ == "__main__":
    main()

提出結果

90_d_AC AC - 1975 ms (Python 3.8.2)
険しい……

PyPy での提出結果

90_d_AC_pypy AC - 908 ms (PyPy3 7.3.0)
さすが PyPy、速いですね。

追記:あの素晴らしい AC をもう一度

記事用に読みやすく書き換えて再提出しました。

90_d_TLE TLE - 2058 ms (Python 3.8.2)
通らない!笑

結論

素の Python で通すのは難しい。 PyPy を使おう。

追記 2

ちょっとだけダイエットに成功しました。

90_d_AC2 AC - 1928 ms (Python 3.8.2)

import sys
input = sys.stdin.readline

def linput(ty=int, cvt=list):
    return cvt(map(ty,input().split()))

# ...中略...

def main():
    H,W = linput()
    mA = [linput() for _ in range(H)]

    vH = [sum(va) for va in mA]
    vW = [sum(ta) for ta in zip(*mA)]

    for va,h in zip(mA,vH):
        print(*(h+w-a for a,w in zip(va,vW)))


if __name__ == "__main__":
    main()

これ以上は、しません。