C-merのブログ

ザ・雑記

AtCoder Regular Contest 061 D - すぬけ君の塗り絵 / Snuke's Coloring

問題
AtCoder Regular Contest 061 D - すぬけ君の塗り絵 / Snuke's Coloring
beta.atcoder.jp

使用言語
C++

要点
・ある塗られたマスを含む9つの各3*3の正方形にスコアを設けてそこの数だけをカウントする
・mapで管理して,キーはpairにする
 要素へのアクセスは{,} でも make_pairでも出来るっぽい
・マスの番号が1〜Nなのに注意
・0のものについては,一つ以上塗られたマスを含んだ時に全体から引いた
・ans[0]でキャストし忘れてバグりました

所感
・Dにしては難しいと思ったのですが,どうなのでしょうか
・解説雑ですみません

コード

ull ans[10];
map<pair<int, int>, int> mp;

int main()
{
  int h, w, n;
  cin>>h>>w>>n;
  ans[0] = (ull)(h-2) * (w-2);

  REP(i,n) {
    int a, b;
    cin>>a>>b;
    FOR(dx,-1,2) {
      FOR(dy,-1,2) {
        if (a+dx<2 || a+dx>h-1 || b+dy<2 || b+dy>w-1)
          continue;

        //cout<<a<<" "<<b<<" "<<a+dx<<" "<<b+dy<<endl;
        pair<int, int> tmpp = {a+dx,b+dy};//make_pair(a+dx,b+dy);
        //ここの入力形式はどちらでも問題がないようです
        if (mp.find(tmpp) == mp.end()) {
          mp[tmpp] = 1;
          ans[0]--;
        } else {
          mp[tmpp]++;
        }
      }
    }
  }

  for (auto itr : mp) {
    ans[itr.second]++;
  }

  REP(i,10) {
    cout<<ans[i]<<endl;
  }

  return 0;
}