いもす法
いもす法の基本: 1 次元 0 次いもす法
図 1: 1 次元上へ 0 次関数を加算するイメージ
問題例
ナイーブな解法
for (int i = 0; i < T; i++) table[i] = 0; for (int i = 0; i < C; i++) { // 時刻 S[i] から E[i] - 1 までのそれぞれについてカウントを 1 増やす for (int j = S[i]; j < E[i]; j++) { table[j]++; } } // 最大値を調べる M = 0; for (int i = 0; i < T; i++) { if (M < table[i]) M = table[i]; }
いもす法による解法
for (int i = 0; i < T; i++) table[i] = 0; for (int i = 0; i < C; i++) { table[S[i]]++; // 入店処理: カウントを 1 増やす table[E[i]]--; // 出店処理: カウントを 1 減らす } // シミュレート for (int i = 0; i < T; i++) { if (0 < i) table[i] += table[i - 1]; } // 最大値を調べる M = 0; for (int i = 0; i < T; i++) { if (M < table[i]) M = table[i]; }
次元の拡張
いもす法の 1 番の特徴はナイーブな方法と比較して,次元の上昇に強いという点です.次元の呪いからは逃れられないので高次元に適用することは難しいですが,問題設定として 2 次元や 3 次元が用いられることは非常に多く,それらの状況においていもす法は有用です.問題例
図 2: モンスターが現れる矩形(赤色)と,
各タイルで現れるモンスターの種類の数
各タイルで現れるモンスターの種類の数
ナイーブな解法
for (int y = 0; y < H; y++) { for (int x = 0; x < W; x++) { tiles[y][x] = 0; } } for (int i = 0; i < N; i++) { // モンスター i が現れる [(A[i],C[i]), (B[i],D[i])) の範囲に 1 を足す for (int y = C[i]; y < D[i]; y++) { for (int x = A[i]; x < B[i]; x++) { tiles[y][x]++; } } } // 最大値を調べる int tile_max = 0; for (int y = 0; y < H; y++) { for (int x = 0; x < W; x++) { if (tile_max < tiles[y][x]) { tile_max = tiles[y][x]; } } }
いもす法による解法
for (int y = 0; y < H; y++) { for (int x = 0; x < W; x++) { tiles[y][x] = 0; } } // 重みの加算 (図 3) for (int i = 0; i < N; i++) { tiles[C[i]][A[i]]++; tiles[C[i]][B[i]]--; tiles[D[i]][A[i]]--; tiles[D[i]][B[i]]++; } // 横方向への累積和 (図 4, 5) for (int y = 0; y < H; y++) { for (int x = 1; x < W; x++) { tiles[y][x] += tiles[y][x - 1]; } } // 縦方向の累積和 (図 6, 7) for (int y = 1; y < H; y++) { for (int x = 0; x < W; x++) { tiles[y][x] += tiles[y - 1][x]; } } // 最大値を調べる int tile_max = 0; for (int y = 0; y < H; y++) { for (int x = 0; x < W; x++) { if (tile_max < tiles[y][x]) { tile_max = tiles[y][x]; } } }
図 3: 重みの加算の結果
図 4: 横方向への累積
図 5: 横方向への累積の結果
図 6: 縦方向への累積
図 7: 縦方向への累積の結果
特殊な座標系への拡張
図 8: 三角形の座標系
差分を取る手法
図 9: 埋めるべき重み
図 10: 図 9 の左上から右下への差分
図 11: 図 10 の右上から左下への差分
図 12: 図 11 の左から右への差分
次数の拡張
2 次関数の差分
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 0 | 0 | 1 | 4 | 9 | 16 | 25 | 36 | 49 |
↓差分 ↑累積和
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 0 | 0 | 1 | 3 | 5 | 7 | 9 | 11 | 13 |
↓差分 ↑累積和
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 0 | 0 | 1 | 2 | 2 | 2 | 2 | 2 | 2 |
↓差分 ↑累積和
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
図 13: 2 次関数 (x-2)_+^2 の差分
ガウス関数といもす法
式 1: ガウス関数(左辺)とその近似(右辺)
図 14: ガウス関数(青)と多項式近似(赤)
-12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 |
0 | 0 | 3 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | -11 | -11 | 0 | 0 | 0 |
↓累積和 ↑差分
-12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 |
0 | 0 | 3 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | -5 | -16 | -16 | -16 | -16 |
↓累積和 ↑差分
-12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 |
0 | 0 | 3 | 9 | 15 | 21 | 27 | 33 | 39 | 45 | 40 | 24 | 8 | -8 | -24 |
↓累積和 ↑差分
-12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 |
0 | 0 | 3 | 12 | 27 | 48 | 75 | 108 | 147 | 192 | 232 | 256 | 264 | 256 | 232 |
図 15: いもす法によって近似されたガウス関数
-12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 |
1 .49 | 3 .42 | 7 .28 |
14 .41 | 26 .57 | 45 .58 | 72 .76 | 108 .08 |
149 .41 | 192 .20 | 230 .09 | 256 .31 | 265 .70 |
256 .31 | 230 .09 |
図 16: 近似目標となるガウス関数
付録
いもす法が使える問題
- [簡単] Osaki … 1 次元 0 次いもす法,ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2007 - [AOJ]
- [簡単] 釘 (Nails) … 三角形座標の 0 次いもす法,日本情報オリンピック2012年 本選4番 - [AOJ]
- [普通] ペンキの色 … 座標圧縮+ 2 次元 0 次いもす法+幅優先探索(スタックの容量次第では深さ優先探索も可),日本情報オリンピック2008年 本選5番 - [AOJ]
- [普通] Plugs … 2 次元 0 次いもす法+アドホック,日本情報オリンピック2010年 合宿4日目4番
- [難] Pyramid … 特殊な座標系の 1 次いもす法,Autumn Fest 2012: I
- [簡単] Osaki … 1 次元 0 次いもす法,ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2007 - [AOJ]
- [簡単] 釘 (Nails) … 三角形座標の 0 次いもす法,日本情報オリンピック2012年 本選4番 - [AOJ]
- [普通] ペンキの色 … 座標圧縮+ 2 次元 0 次いもす法+幅優先探索(スタックの容量次第では深さ優先探索も可),日本情報オリンピック2008年 本選5番 - [AOJ]
- [普通] Plugs … 2 次元 0 次いもす法+アドホック,日本情報オリンピック2010年 合宿4日目4番
- [難] Pyramid … 特殊な座標系の 1 次いもす法,Autumn Fest 2012: I