题目链接
思路:r【i】【j】代表i这一行能存多少个,c【i】【j】代表j这一列能存多少个。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=505;
char s[maxn][maxn];
int r[maxn][maxn],c[maxn][maxn];
int main()
{
int n,h,q,x1,y1,x2,y2;
scanf("%d %d",&n,&h);
for(int i=1;i<=n;++i) scanf("%s",s[i]+1);
for(int i=1;i<=n;++i)
for(int j=1;j<=h;++j)
r[i][j]=r[i][j-1]+(s[i][j]=='.'&&s[i][j-1]=='.');
for(int j=1;j<=h;++j)
for(int i=1;i<=n;++i)
c[j][i]=c[j][i-1]+(s[i][j]=='.'&&s[i-1][j]=='.');
scanf("%d",&q);
while(q--)
{
ll ans=0;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
for(int i=x1;i<=x2;++i) ans+=r[i][y2]-r[i][y1];
for(int i=y1;i<=y2;++i) ans+=c[i][x2]-c[i][x1];
printf("%lld\n",ans);
}
}