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; }