Description
给定一个n*m 的 01 矩阵,求包含[l,r]个 1 的子矩形个数。
Input
第一行,两个正整数n,m。
接下来n 行,每行一个长度为 m 的 01 串,表示给定的矩阵。接下来一行,两个自然数 l,r。
接下来n 行,每行一个长度为 m 的 01 串,表示给定的矩阵。接下来一行,两个自然数 l,r。
Output
第一行,一个整数代表答案。
View Code
Data Constraint
做法:由于n很小,我们可以枚举n,统计答案。
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #define LL long long 5 #define rep(i,a,b) for(int i=a;i<=b;i++) 6 using namespace std; 7 int n,m; 8 int a[32][50007],Q[32][50007],f[50007],L,R; 9 LL ans; 10 11 void Init(){ 12 scanf("%d%d",&n,&m); 13 char ch=getchar(); 14 rep(i,1,n){ 15 rep(j,1,m){ 16 char ch=getchar(); 17 a[i][j]=ch-'0'; 18 Q[i][j]=Q[i-1][j]+Q[i][j-1]-Q[i-1][j-1]+a[i][j]; 19 } 20 char ch=getchar(); 21 } 22 scanf("%d%d",&L,&R); 23 } 24 25 void Calc(int up,int down){ 26 rep(i,1,m) f[i]=Q[down][i]-Q[up-1][i]; 27 int l=0,r=0; 28 rep(i,1,m){ 29 for(;f[i]-f[r]>=L&&r<i;r++); 30 for(;f[i]-f[l]>R&&l<i;l++); 31 ans+=r-l; 32 } 33 } 34 35 void Work(){ 36 ans=0; 37 rep(i,1,n) 38 rep(j,i,n) 39 Calc(i,j); 40 printf("%lld",ans); 41 } 42 43 int main(){ 44 freopen("a.in","r",stdin); 45 freopen("a.out","w",stdout); 46 Init(); 47 Work(); 48 }