Matrix Operation 原作:松本 修正:岩田 担当:野田・平澤 問題概略 • 各要素の初期値が {ar,c}=Ar+Bc (列番号と行番号の線形結合) で与えられる正方行列に対し以下の処理を順に行い、 最終的に得られた行列からハッシュ値を計算せよ ▫ ▫ ▫ ▫ 1要素への書き込み・要素間でのコピー 2行の入れ替え・2列の入れ替え 90度回転 (時計回り・反時計周り) 上下反転・左右反転 • 制約 ▫ 行列の1辺のサイズ(N):最大40,000 ▫ クエリの数(Q):最大40,000 ▫ ハッシュを計算する範囲:最大1,000×1,000 想定誤解法 • N×N行列をメモリ上に確保し、 クエリが来る度にその行列を実際に操作する ▫ Nが最大40,000なので、そもそもメモリに乗らない • クエリを全て読み込んだ後で、 ハッシュ計算に必要なそれぞれの値を クエリを遡っていきながら計算する ▫ ハッシュ計算に必要な値が1,000,000個あり、 クエリが40,000個なので(通常は)無理。 想定解法 (オーダー) • 行列サイズ(N):~40,000 • クエリ数(Q):~40,000 • ハッシュ計算に必要な要素(K): ~1,000,000 • 各クエリをO(logN)やO(logQ)程度で実現 ▫ 40,000 log(40,000) = 2,000,000 • ハッシュ計算をだいたいO(K)で実現 ▫ O(K+X)とかでもXが小さければOK 想定解法 (実現方法) • クエリの実現方法 ▫ 盤面全体をどれだけ回転・反転したかを持つ 回転・反転動作がO(1)になる ▫ 盤面の各列各行をどのように移動したかを持つ 行・列の入れ替え動作がO(1)になる ▫ 書き込み・コピーにより上書きした要素だけ記憶 上書き要素数は最大でQ個。 map等で保持すればO(logQ)で検索できる それ以外は行番号・列番号から計算可能 • 値の取得方法 ▫ mapに記録されていればその値・なければ初期値 注意点 • 操作順序に気をつける ▫ 90度回転した後に上下反転するのと 上下反転した後に90度回転するのは異なる AB CD 回転 CA DB 反転 DB CA 別物! AB CD 反転 CD AB 回転 AC BD • 常に操作順序を統一しておけばok クエリ 回転操作 反転操作 上書き操作 など 提出状況 • 提出チーム数: • 受理チーム数: • 総提出数: • First accepted: mlTwTlm (71min)
© Copyright 2024 ExpyDoc