intさわだんのBlack History

刹那的レジェンドになりたい。

JOI本選過去問 第10回 日本情報オリンピック本選 一問目 惑星探査

問題文はこちら

たぶんやるだけ。

もっともっといい解法がある気が...


そーす汚すぎて何も言えないです。

#include <cstdio>

using namespace std;

int n = 0,m = 0;

long k = 0;

char tizu[1003][1003];

int dp[1003][1003][3] = {0};


int func(char sss){
  int r = 2;
  if(sss == 'J'){
    r = 0;
  }else if(sss == 'O'){
    r = 1;
  }
  return r;
}


int main(){

  scanf("%d%d%ld",&m,&n,&k);


  for(int i = 0;i < m;i++){
    scanf("%s",tizu[i]);
  }

  if(tizu[0][0] == 'J'){
    dp[0][0][0] = 1;
  }else if(tizu[0][0] == 'O'){
    dp[0][0][1] = 1;
  }else{
    dp[0][0][2] = 1;
  }

  for(int i = 1;i < n;i++){
    dp[0][i][0] = dp[0][i-1][0];
    dp[0][i][1] = dp[0][i-1][1];
    dp[0][i][2] = dp[0][i-1][2];

    dp[0][i][func(tizu[0][i])] += 1;
  }


  for(int i = 1;i < m;i++){
    dp[i][0][0] = dp[i-1][0][0];
    dp[i][0][1] = dp[i-1][0][1];
    dp[i][0][2] = dp[i-1][0][2];

    dp[i][0][func(tizu[i][0])] += 1;

  }


  for(int i = 1;i < m;i++){
    for(int j = 1;j < n;j++){

      dp[i][j][0] = dp[i-1][j][0] + dp[i][j-1][0] - dp[i-1][j-1][0];
      dp[i][j][1] = dp[i-1][j][1] + dp[i][j-1][1] - dp[i-1][j-1][1];
      dp[i][j][2] = dp[i-1][j][2] + dp[i][j-1][2] - dp[i-1][j-1][2];

      dp[i][j][func(tizu[i][j])] += 1;

    }
  }

  for(int i = 0;i < k;i++){
    int a1,a2,a3,a4;

    scanf("%d%d%d%d",&a1,&a2,&a3,&a4);

    int k1x = a2 -1-1; if(k1x < 0) k1x = 1000;
    int k1y = a1 - 1-1; if(k1y < 0) k1y = 1000;
    int k2x = a4-1;
    int k2y = a1 -1-1; if(k2y < 0) k2y = 1000;
    int k3x = a2 -1-1; if(k3x < 0) k3x = 1000;
    int k3y = a3 -1; 
   
    for(int j = 0;j < 3;j++){
      int  ans = (dp[a3-1][a4-1][j]  -dp[k2y][k2x][j]-dp[k3y][k3x][j]+dp[k1y][k1x][j]);
      printf("%d",ans);

      if(j == 2){
	printf("\n");
      }else{
	printf(" ");
      }

    }
  }

  return 0;
}