問題
C – 菱型カウント
回答
スライドの解説に従うとTLEになってしまいました。
以下を参考にして、いもす法を用いました。
# https://emtubasa.hateblo.jp/entry/2018/11/09/031048 参照 R, C, K = map(int, input().split()) S = [input() for _ in range(R)] # imos[x][y] := (x, y)を中心として菱形を作成した時、 # その範囲内にある黒マスの個数 imos = [[0] * (C+1) for _ in range(R)] for r in range(R): for c in range(C): if S[r][c] == 'x': for k in range(K): if r-k >= 0: imos[r-k][max(0, c-K+1+k)] += 1 imos[r-k][min(C-1, c+K-k)] -= 1 if r+k < R: imos[r+k][max(0, c-K+1+k)] += 1 imos[r+k][min(C-1, c+K-k)] -= 1 for r in range(R): for c in range(1, C+1): imos[r][c] += imos[r][c-1] ans = 0 # 中心 (r, c) を固定 for r in range(K-1, R-K+1): for c in range(K-1, C-K+1): if imos[r][c] == 0: ans += 1 print(ans)