寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

AtCoder Problems in C++ #A - 惑星探査 (Planetary Exploration)

第10回日本情報オリンピック 本選(過去問)から、その提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
競技プログラミング」を略して、「競プロ」などと呼ばれています。

#A - 惑星探査 (Planetary Exploration)

https://www.ioi-jp.org/joi/2010/2011-ho-tasks_data/2011-ho.pdf#page=2

僕が作成、提出したコードは、以下のとおりです。

/*
AtCoder Problems in C++
#A - 惑星探査 (Planetary Exploration)
https://www.ioi-jp.org/joi/2010/2011-ho-tasks_data/2011-ho.pdf#page=2
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
  int m,n,k;
  cin>>m>>n>>k;
  vector<string> joi(n);
  vector<vector<int>> vj(m+1,vector<int>(n+1,0));
  vector<vector<int>> vo(m+1,vector<int>(n+1,0));
  vector<vector<int>> vi(m+1,vector<int>(n+1,0));
  for(int i=0;i<m;i++){
    cin>>joi[i];
    for(int j=0;j<n;j++){
      vj[i+1][j+1]=vj[i+1][j]+vj[i][j+1]-vj[i][j];
      vo[i+1][j+1]=vo[i+1][j]+vo[i][j+1]-vo[i][j];
      vi[i+1][j+1]=vi[i+1][j]+vi[i][j+1]-vi[i][j];
      if(joi[i].at(j)=='J'){
        vj[i+1][j+1]++;
      }
      if(joi[i].at(j)=='O'){
        vo[i+1][j+1]++;
      }
      if(joi[i].at(j)=='I'){
        vi[i+1][j+1]++;
      }
    }
  }
  for(int i=0;i<k;i++){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int aj=vj[c][d]-vj[c][b-1]-vj[a-1][d]+vj[a-1][b-1];
    int ao=vo[c][d]-vo[c][b-1]-vo[a-1][d]+vo[a-1][b-1];
    int ai=vi[c][d]-vi[c][b-1]-vi[a-1][d]+vi[a-1][b-1];
    cout<<aj<<" "<<ao<<" "<<ai<<endl;
  }
  return 0;
}