米田氏が企画した「競プロ典型90問」を解いていきます。
ここでは私の試行錯誤やら解説の理解やら気づきやらをメモしていこうと思います。
競プロ初心者なのでどうか温かい目で見守ってください。
なお、本記事中のPythonコードはブラウザ上で実行可能です。
よろしければ遊んでいってください。
問題
kyopro_educational_90/004.jpg at main · E869120/kyopro_educational_90
![](data:image/png;base64,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)
004 - Cross Sum(★2)
やってみよう!
テストデータ・テスト関数定義 ↓
# 縮小表示
test_data = [
{
"in":[3, 3, [[1, 1, 1], [1, 1, 1], [1, 1, 1]]],
"out": '''5 5 5
5 5 5
5 5 5
'''
},{
"in":[4, 4, [[3, 1, 4, 1], [5, 9, 2, 6], [5, 3, 5, 8], [9, 7, 9, 3]]],
"out": '''28 28 25 26
39 33 40 34
38 38 36 31
41 41 39 43
'''
},{
"in":[2, 10, [[31, 41, 59, 26, 53, 58, 97, 93, 23, 84], [62, 64, 33, 83, 27, 95, 2, 88, 41, 97]]],
"out": '''627 629 598 648 592 660 567 653 606 662
623 633 651 618 645 650 689 685 615 676
'''
},{
"in":[10, 10, [[83, 86, 77, 65, 93, 85, 86, 92, 99, 71], [62, 77, 90, 59, 63, 76, 90, 76, 72, 86], [61, 68, 67, 79, 82, 80, 62, 73, 67, 85], [79, 52, 72, 58, 69, 67, 93, 56, 61, 92], [79, 73, 71, 69, 84, 87, 98, 74, 65, 70], [63, 76, 91, 80, 56, 73, 62, 70, 96, 81], [55, 75, 84, 77, 86, 55, 96, 79, 63, 57], [74, 95, 82, 95, 64, 67, 84, 64, 93, 50], [87, 58, 76, 78, 88, 84, 53, 51, 54, 99], [82, 60, 76, 68, 89, 62, 76, 86, 94, 89]]],
"out": '''1479 1471 1546 1500 1518 1488 1551 1466 1502 1546
1414 1394 1447 1420 1462 1411 1461 1396 1443 1445
1388 1376 1443 1373 1416 1380 1462 1372 1421 1419
1345 1367 1413 1369 1404 1368 1406 1364 1402 1387
1416 1417 1485 1429 1460 1419 1472 1417 1469 1480
1410 1392 1443 1396 1466 1411 1486 1399 1416 1447
1397 1372 1429 1378 1415 1408 1431 1369 1428 1450
1419 1393 1472 1401 1478 1437 1484 1425 1439 1498
1366 1390 1438 1378 1414 1380 1475 1398 1438 1409
1425 1442 1492 1442 1467 1456 1506 1417 1452 1473
'''
},
]
def test_all(f):
for i, data in enumerate(test_data):
exp = data["out"]
ans = f(*data["in"])
result = "AC" if exp == ans else "WA"
print(f"{i+1} {result}")
下のmain0
関数を完成させて「Run」ボタンをクリックしよう!
def main0(H, W, A):
pass
test_all(main0)
自由欄
try(1st.)
このような単純に計算する問題はnumpy
でサクッと解きたいところです。
AtCoderのPythonでは以下ライブラリが使用可能です。(ref. Language Test 202001 - AtCoder)
- numba
- numpy
- scipy
- scikit-learn
- networkx
import numpy as np
def main(H, W, A):
data = np.array(A)
rows = data.sum(axis=1)
cols = data.sum(axis=0)
ans = np.add(*np.meshgrid(rows, cols, indexing="ij")) - data
ret = ""
for l in ans:
ret += f'{" ".join(l.astype(str))}\n'
return ret
test_all(main)
結果(1st.)
一発AC!
提出 #32460167 - 競プロ典型 90 問
他の人のコードを見てみる
せっかくなのでPythonで実装された他のコードを短いものから見てみましょう。
※類似するコードは提出の古いものだけ紹介します
"Python, 短い順" | すべての提出 - 競プロ典型 90 問
提出 #21938944 - 競プロ典型 90 問
_,*e=[[*map(int,s.split())]for s in open(0)]
*w,=map(sum,zip(*e))
for a in e:h=sum(a);print(*[h+w-a for a,w in zip(a,w)])
open(0)について
初見です。
pythonに慣れてくるほど思考停止してwith open()
と書いてしまいがちですが、結局with
構文は前処理と後処理を自動化してくれるだけなので、仕組みを理解していれば必ずしも必要ありません。
そしてopen
関数の場合の後処理は、f.close()
です。(ref. 7. 入力と出力 — Python 3.9.12 ドキュメント
もし with
キーワードを使用しない場合は、ファイルを閉じ、このファイルのために利用されたシステムのリソースを直ちに解放するために f.close()
を呼び出してください。
警告 f.write()
を with
キーワードや f.close()
を使わずに呼び出した場合、プログラムが正常に終了した場合でも、 f.write()
の実引数がディスクに完全に 書き込まれないことがあります 。
しかも上の引用の通り、問題が生じる可能性が高いのは書き込みの場合です。
もちろん実プロダクトであれば"安全な"コーディングをするに越したことはありませんが、競プロで使い捨てるレベルであればあまり神経質にならずともよさそうです。
本題の引数について、open関数はpath-like objectだけでなくファイルディスクリプタの整数も取ることができます。
そしてSTDINのファイルディスクリプタは0です。(Man page of STDIN)
従ってopen(0)
で、標準入力からEOFまで読み込んでファイルオブジェクトとして返してくれるという訳です。
1行目:入力データの読み込み
読み込んだ標準入力の最初の行を読み捨て、2行目以降をe
に代入しています。
# データの準備
# _,*e=[[*map(int,s.split())]for s in open(0)] に相当
e = test_data[1]["in"][2]
e
2行目:列ごとの合計を計算
まずzip(*e)
で2次元の配列を転置することができます。(すごい!)
list(zip(*e))
列の配列にしたところで、列ごとに合計を計算します。
ここでmap関数が返すのはイテレーターですが、アンパックして代入することでコーディング量を減らしています。(すごい!)
# mapが返すのはイテレーター
w = map(sum,zip(*e))
print(w)
# イテレーターからリストにする
print(list(w))
# アンパックでリスト化
*w, = map(sum,zip(*e))
w
# カンマが無いとエラー
*w = map(sum,zip(*e))
w
3行目:行の合計を計算しつつ、「行の合計」+「列の合計」を出力
for a in e:h=sum(a);print(*[h+w-a for a,w in zip(a,w)])
同じ変数名を使いまわしているのでこんがらがりそうですが、以下のことをやっています。
print
に複数引数を渡すとスペース区切りで出力されることをうまく利用しています。(天才か!)
col_sums = w
for row in e:
row_sum = sum(row)
print(*[row_sum + col_sum - r for r, col_sum in zip(row, col_sums)])
提出 #22302875 - 競プロ典型 90 問
h,w,*A=map(int,open(0).read().split())
C=[sum(A[i::w])for i in range(w)]
for i in range(h*w):
if i%w<1:r=sum(A[i:i+w])
print(r+C[i%w]-A[i])
1行目
こちらでは入力を1次元の配列として受け取っています。
# データの準備
from itertools import chain
# h,w,*A=map(int,open(0).read().split()) に相当
h,w,A = test_data[1]["in"]
*A, = chain.from_iterable(A)
h, w, A
2, 4行目
スライスを巧みに駆使して行と列の合計を計算しています。
(出力が指定と異なるのになぜかAC…)
C=[sum(A[i::w])for i in range(w)]
for i in range(h*w):
if i%w<1:r=sum(A[i:i+w])
print(r+C[i%w]-A[i])
提出 #24216523 - 競プロ典型 90 問
from numpy import*
print(*(sum(a:=int_([int_(t.split())for t in[*open(0)][1:]]),0)+vstack(sum(a,1))-a).flatten().tolist())
まさかのワンライナー!
やってることは以下と同等です。
A = test_data[1]["in"][2]
A
rows = np.sum(A, 1).reshape(-1, 1)
cols = np.sum(A, 0)
from pprint import *
pp(rows)
pp(cols)
pp(rows + cols - A)
行ベクトルと列ベクトルを普通に足したら行列を作れるんですね。
わざわざmeshgrid
使わなくてよかったんや…
まとめ
別にnumpy
使わずともサクッと書ける人は書ける😓
自由欄