#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 1001;
const int N = 5;
int rsum[maxn][maxn][N],d[maxn][maxn][N];
int a[maxn][maxn],SUM[maxn][maxn],n,m,Q;
int sum(int i,int x,int y,int d){
return rsum[i][y][d] - rsum[i][x-1][d];
}
int cal(int x,int y,int D){
int res = 0;
int step = 0;
for(;;){
if(x - step < 1) break;
int L = max(1,y-step);
int R = min(m,y+step);
res +=(SUM[x-step][R] - SUM[x-step][L-1]);
step+=D;
}
return res;
}
int main()
{
memset(SUM,0,sizeof(SUM));
while(scanf("%d %d %d",&n,&m,&Q)==3){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
int ch=getchar();
while(ch!='.'&&ch!='X') ch=getchar();
a[i][j] = (ch=='X' ? 1 : 0);
SUM[i][j] = SUM[i][j-1] + a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<N;k++){
int add = 0;
if(i - k > 0 && j + k <= m) add = rsum[i-k][j+k][k];
rsum[i][j][k] = add + a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<N;k++){
rsum[i][j][k] = rsum[i][j][k] + rsum[i][j-1][k];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<N;k++){
if(i <= k || j <= k){
int& res =d[i][j][k];
res = cal(i,j,k);
}
else {
int L = max(1,j - k + 1);
int R = min(m,j + k);
d[i][j][k] = d[i-k][j-k][k] + sum(i-k,L,R,k) + a[i][j];
}
}
while(Q--){
int x,y,D;
scanf("%d %d %d",&x,&y,&D);
if(D < N) printf("%d\n",d[x][y][D]);
else {
printf("%d\n",cal(x,y,D));
}
}
}
return 0;
}
HDU - 5110(递推)
最新推荐文章于 2020-03-19 19:32:51 发布