给出一个矩形n*m,点可以放东西,#不可以。每个多米诺骨牌占用2格
每次(p次)询问一个小矩形能放多少骨牌
****
****
****
####
可以知道3*4的矩形骨牌数A
和4*4的矩形骨牌数B
ans+=b[x2][i]-b[x1][i];
----------------------------------------------------------------------------------------------------------------------------------
第一种方法:
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <set> #include <vector> #include <iostream> using namespace std; int inf=15; double eps=0.000001; int n,m; char mp[505][505]; int dp[505][505]; int out_left[505][505]; int out_up[505][505]; int main() { int i,j,q; scanf("%d%d",&n,&m); for (i=1;i<=n;i++) { scanf("%s",mp[i]+1); } for (i=0;i<=n;i++) { dp[i][0]=0; dp[0][i]=0; } for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { if (mp[i][j]=='#') dp[i][j]=dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1]; else { int ret=0; if (mp[i][j-1]=='.') { ret++;out_left[i][j]=1;} if (mp[i-1][j]=='.') { ret++;out_up[i][j]=1;} dp[i][j]=dp[i][j-1]+dp[i-1][j]+ret -dp[i-1][j-1]; } } } /* for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { printf("%d ",dp[i][j]); } printf("\n"); }*/ scanf("%d",&q); int r1,r2,c1,c2; for (i=1;i<=q;i++) { scanf("%d%d%d%d",&r1,&c1,&r2,&c2); int ans=0; for (j=r1;j<=r2;j++) ans+=out_left[j][c1]; for (j=c1;j<=c2;j++) ans+=out_up[r1][j]; printf("%d\n",dp[r2][c2]-dp[r1-1][c2]-dp[r2][c1-1]+dp[r1-1][c1-1]- ans); } return 0; }