#3962. [GESP2406 五级] ⿊⽩格
[GESP2406 五级] ⿊⽩格
⿊⽩格
题目描述
⼩杨有⼀个 ⾏ 列的⽹格图,其中每个格⼦要么是⽩⾊,要么是⿊⾊。 ⼩杨想知道⾄少包含 个⿊⾊格⼦的最⼩⼦矩形包含了多少个格⼦。
输入格式
第⼀⾏包含三个正整数 ,含义如题⾯所⽰。 之后 ⾏,每⾏⼀个长度为 的 串,代表⽹格图第 ⾏格⼦的颜⾊,如果为 ,则对应格⼦为⽩⾊,否则为⿊ ⾊。
输出格式
输出⼀个整数,代表⾄少包含 个⿊⾊格⼦的最⼩⼦矩形包含格⼦的数量,如果不存在则输出 。 3.1.4 样例1 1 4 5 5 2 00000 3 01111 4 00011 5 00011 1 6 3.1.5 样例解释 对于样例1,假设 ( ) 代表第 ⾏第 列,⾄少包含 个⿊⾊格⼦的最⼩⼦矩形的四个顶点为 ( ),( ),( ),( ),共包含 个格⼦。 3.1.6 数据范围 子任务编号 数据点占比 1 20% 2 40% 3 40% 对于全部数据,保证有 。 3.1.7 参考程序 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 110; 4 int w[N][N]; 5 int sum[N][N]; 6 int n,m; 7 8 int main(){ 9 int k; 10 cin>>n>>m>>k; 11 for(int i=1;i<=n;i++){ 12 string s; 13 cin>>s; 14 for(int j=1;j<=m;j++){ 15 w[i][j]=s[j-1]-'0'; 16 sum[i][j]=sum[i][j-1]+w[i][j]; 17 } 18 } 19 int ans = 0; 20 for(int i=1;i<=m;i++){ 21 for(int j=i;j<=m;j++){ 22 vector num; 23 int now = 0; 24 for(int l=1;l<=n;l++){ 25 int tmp = sum[l][j]-sum[l][i-1]; 26 now+=tmp; 27 num.push_back(now); 28 if(now>=k){ 29 if(ans ==0)ans=(j-i+1)l; 30 else ans=min(ans,(j-i+1)l); 31 int L=1,R=l; 32 while (L < R){ 33 int mid = L + R + 1 >> 1; 34 if (now-num[mid-1]>=k) L = mid; 35 else R = mid - 1; 36 } 37 if(now-num[L-1]>=k){ 38 if(ans ==0)ans=(j-i+1)(l-L); 39 else ans=min(ans,(j-i+1)(l-L)); 40 } 41 } 42 } 43 } 44 } 45 cout<<ans<<"\n"; 46 }
样例输入 #1
1 4 5 5
2 00000
3 01111
4 00011
5 00011
1 6
样例输出 #1
样例解释 #1
对于样例1,假设 ( ) 代表第 ⾏第 列,⾄少包含 个⿊⾊格⼦的最⼩⼦矩形的四个顶点为 ( ),( ),( ),( ),共包含 个格⼦。
数据范围
子任务编号 数据点占比 1 20% 2 40% 3 40% 对于全部数据,保证有 。
知识点与难度
本题涉及的知识点从属于 GESP 5级,难度等级:⭐⭐⭐⭐ 。
测试点分布
| Subtask | 分值 | 测试点编号 | 说明 |
|---|---|---|---|
| 0 | 10 | 1~2 | 样例 |
| 1 | 20 | 3~8 | 小规模 / 特殊性质 |
| 2 | 15 | 9~11 | Hack |
| 3 | 30 | 12~20 | 中大规模 |
| 4 | 25 | 21~25 | 随机回归 |
生测试数据后,按实际 subtask 分组改写上表。