JZOJ 5842

Description

给定一个n*m 的 01 矩阵,求包含[l,r]个 1 的子矩形个数。
 

Input

第一行,两个正整数n,m。
接下来n 行,每行一个长度为 m 的 01 串,表示给定的矩阵。接下来一行,两个自然数 l,r。
 

Output

第一行,一个整数代表答案。
 

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 } 
View Code

猜你喜欢

转载自www.cnblogs.com/traveller-ly/p/9541714.html