公式
D - 画像回転エディタ / Image Rotation Editor 解説 by admin
Qwen3-Coder-480B概要
\(N \times N\) の白黒画像に対し、\(K \times K\) の部分領域を時計回りに90度回転させる操作を \(Q\) 回行った後の画像の状態を出力する問題。
考察
この問題は、単純にシミュレーションを行うことで解けるが、重要なのは各操作を効率的に処理することである。
- 各操作では \(K \times K\) の領域を回転させる必要がある。
- 単純に回転ロジックを書けば1つの操作あたり \(O(K^2)\) かかる。
- 全体では最大 \(Q = 2 \times 10^5\) 回の操作があり、\(K\) も最大 \(N = 500\) になりうるため、全体で最大 \(2 \times 10^5 \times 500^2 = 5 \times 10^{10}\) の計算が必要になる可能性がある。
- しかし制約に \(Q \times K^2 \leq 2 \times 10^7\) とあるため、全操作をシミュレーションしても十分間に合う。
したがって、素朴なシミュレーションでも問題なく動作する。
アルゴリズム
- 入力として画像データと操作列を受け取る。
- 各操作について以下を行う:
- 左上座標 \((R, C)\) をもとに、\(K \times K\) の部分領域を抽出。
- その部分領域を時計回りに90度回転させる。
- 回転後の値を元の画像に戻す。
- 最終的な画像を出力。
時計回り90度回転の方法
二次元配列 grid[K][K] を時計回りに90度回転するには、新しい配列 rotated[K][K] を用意し、以下のように要素をコピーする:
\[ \text{rotated}[j][K - 1 - i] = \text{grid}[i][j] \]
これは数学的に90度回転の変換則に基づいている。
計算量
- 時間計算量: \(O(Q \times K^2)\)
- 空間計算量: \(O(N^2 + K^2)\)
- \(N^2\) は画像全体を保持するため、\(K^2\) は一時的に部分領域をコピーするため。
実装のポイント
座標系は入力が1-indexedなので、内部処理では0-indexedに変換する必要がある。
回転処理は新しい配列を作って行うことで、元データを破壊せずに安全に処理できる。
入力を高速に読み込むために
sys.stdin.readを使用している(Pythonでの高速化テクニック)。ソースコード
def rotate_90_clockwise(grid):
K = len(grid)
rotated = [[0] * K for _ in range(K)]
for i in range(K):
for j in range(K):
rotated[j][K - 1 - i] = grid[i][j]
return rotated
def main():
import sys
input = sys.stdin.read
data = input().split()
idx = 0
N = int(data[idx]); idx += 1
K = int(data[idx]); idx += 1
Q = int(data[idx]); idx += 1
# Read the initial image
image = []
for _ in range(N):
row = list(data[idx])
image.append([int(c) for c in row])
idx += 1
# Process each rotation operation
for _ in range(Q):
r = int(data[idx]) - 1; idx += 1 # Convert to 0-based index
c = int(data[idx]) - 1; idx += 1
# Extract the KxK subgrid
subgrid = []
for i in range(r, r + K):
subgrid.append(image[i][c:c + K])
# Rotate the subgrid
rotated_subgrid = rotate_90_clockwise(subgrid)
# Place the rotated subgrid back into the image
for i in range(K):
for j in range(K):
image[r + i][c + j] = rotated_subgrid[i][j]
# Output the final image
for row in image:
print(''.join(map(str, row)))
if __name__ == "__main__":
main()
この解説は qwen3-coder-480b によって生成されました。
投稿日時:
最終更新: