numo-narrayをつかっていもす法を利用する競プロの問題を解いてみました。Paper(★4)を使用しました。installが必要です。ans[i]end解説この問題は、平面上に紙を重ねっていって、最後に上から見たときの厚さ(n枚の紙が重なっていると厚さがn)毎の面積を答える問題になっています。M)これは、[M,M]の大きさを持ったすべての要素が0である行列を作ります。y]の要素を更新しています。2次元配列を使ったとき(field[x][y])と違って、field[x,y]のように行と列を同時に指定します。コードの意味としては、紙を置いたときの左上の座標と右下の座標に1加え、右上と左下の座標から1減らす操作です。i]endこれは、行を上から下に列を左から右に累積和を求めています。i行目のビューを取得します。i列目のビューを取得します。ビューは元の行列に対しての参照になっているため、中身の要素は元の行列と同じものを指しており、ビューの要素を書き換えることで元の行列に対しての要素を書き換えます。#inplaceには、レシーバーに対しての破壊的な変更を行う意味があり、直接レシーバーの要素を書き換えます。i行目をi+1行目に足すという処理になります。true]のように書くこともできますが、新しいオブジェクトが生成されることでメモリを消費するため、今回は破壊的に変更を加えるようにしました。ans[i]endここまでの処理で、フィールド上に紙の厚さに対応した要素が面積1につき1個できているので、各厚みを数えます。field.eachは行列の各要素をイテレートするので、要素毎に計数用のans配列を+1し、最後に1~Nまでの厚さ毎の面積を出力して解答となります。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。