Codeforces 013. 二分+二维前缀和 (矩阵)
原题链接
简单
作者:
etener
,
2023-10-16 19:07:06
,
所有人可见
,
阅读 49
#pragma GCC optimize(3,"Ofast","inline")
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
#define int long long
int n,m;
vector<vector<int>>a;
bool check(int x){
vector<vector<int>>s(n+1,vector<int>(m+1,0));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+(a[i][j]>=x);
}
}
for(int i=x;i<=n;i++){
for(int j=x;j<=m;j++){
int z=i-x+1,y=j-x+1;
int ti=s[i][j]-s[z-1][j]-s[i][y-1]+s[z-1][y-1];
if(ti==x*x) return 1;
}
}
return 0;
}
void solve()
{ cin>>n>>m;
a=vector<vector<int>>(n+5,vector<int>(m+5,0));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++ ) cin>>a[i][j];
}
int l=1,r=min(n,m);
while(l<r){
int mid=(l+r+1)/2;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t; cin>>t;
while(t--)
{
solve();
}
return 0;
}