D. Valiant's New Map
题解
易得答案具有单调性,再加上 \(n·m<=1e6\) 故确定了二分
正方形每个数都大于 \(x\) \(\to\) 正方形内每个数减去 \(x\) ,1的数量是否达到 \(x^2\) \(\to\) 差分面积是否达到 \(x^2\)
code
#include<bits/stdc++.h>
using namespace std;
vector<int> a[1000006],b[1000006];
int n,m;
int check(int x)
{
b[0].resize(m+1);
for(int i=0;i<=m;i++) b[0][i]=0;//动态差分数组清零的方法
for(int i=1;i<=n;i++)
{
b[i].resize(m+1);
b[i][0]=0;//动态差分数组清零方法
for(int j=1;j<=m;j++)
{
b[i][j]=(a[i][j]>=x);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
b[i][j]+=b[i][j-1]+b[i-1][j]-b[i-1][j-1];
}
}
for(int i=x;i<=n;i++)
{
for(int j=x;j<=m;j++)
{
if(b[i][j]-b[i-x][j]-b[i][j-x]+b[i-x][j-x]==x*x) return 1;
}
}
return 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
a[0].resize(m+1);
for(int i=0;i<=m;i++) a[0][i]=0;
for(int i=1;i<=n;i++)
{
a[i].resize(m+1);
a[i][0]=0;
for(int j = 1; j <=m; j++) cin >> a[i][j];
}
int l=1,r=min(n,m)+1;
while(l+1<r)
{
int mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
for(int i=0;i<n;i++) a[i].clear(),b[i].clear();
cout<<l<<endl;
}
return 0;
}

浙公网安备 33010602011771号