ABC045-D:すぬけ君の塗り絵 / Snuke's Coloring
問題
https://beta.atcoder.jp/contests/abc045/tasks/arc061_b
考え方
黒く塗る点は N 個しかないので、 N 個の点に着目する。
3 * 3 のマスに含まれる数を数えるとき、ある黒く塗る点 (i, j) は自身を含めて周囲 9 マスにしか影響を及ぼさない。
よって影響のあるマスを数を数えばよい。3 * 3 マスの数え上げに影響のあるマスは高々 9N である。
public void solve(int testNumber, InputReader in, PrintWriter out) { long h = in.nextLong(), w = in.nextLong(); int n = in.nextInt(); int[] a = new int[n]; int[] b = new int[n]; for (int i = 0; i < n; i++) { a[i] = in.nextInt(); b[i] = in.nextInt(); } Map<P, Integer> map = new HashMap<>(); for (int i = 0; i < n; i++) { for (int j = 0; j < 9; j++) { int mh = a[i] + mh9[j]; int mw = b[i] + mw9[j]; if (2 <= mh && mh < h && 2 <= mw && mw < w) { map.merge(new P(mh, mw), 1, Integer::sum); } } } TreeMap<Long, Long> ans = new TreeMap<>(); ans.put(0L, (h-2)*(w-2)); for (long i = 1L; i <= 9; i++) { ans.put(i, 0L); } for (long count : map.values()) { ans.merge(0L, -1L, Long::sum); ans.merge(count, 1L, Long::sum); } for (long i : ans.values()) { out.println(i); } }
ポイント
- 数え上げる対象を別に対応させる
- 要素をまとめる
類題
D - 連結 / Connectivity
要素をまとめる考え方は似ています。
雑記
これ系苦手な感じがある...