D. Valiant's New Map

原题链接

题解

易得答案具有单调性,再加上 n·m<=1e6 故确定了二分
正方形每个数都大于 x 正方形内每个数减去 x ,1的数量是否达到 x2 差分面积是否达到 x2

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;
}

posted @   纯粹的  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示