公式

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\) とあるため、全操作をシミュレーションしても十分間に合う。

したがって、素朴なシミュレーションでも問題なく動作する。

アルゴリズム

  1. 入力として画像データと操作列を受け取る。
  2. 各操作について以下を行う:
    • 左上座標 \((R, C)\) をもとに、\(K \times K\) の部分領域を抽出。
    • その部分領域を時計回りに90度回転させる。
    • 回転後の値を元の画像に戻す。
  3. 最終的な画像を出力。

時計回り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 によって生成されました。

投稿日時:
最終更新: