求助!
查看原帖
求助!
486441
13833925596mm楼主2023/4/15 12:56
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,fa[1000000],a[1000000],dge[1000000];
bool f[1000000];
ll find(ll x){
    if(fa[x]==x) return x;
    fa[x]=find(fa[x]);
    return fa[x];
}
void he(ll x,ll y){
    if(dge[x]<=dge[y]) fa[x]=y;
    else fa[y]=x;
    if(dge[x]==dge[y] && x!=y) dge[y]++;
}
bool cheak(ll x){
    memset(dge,0,sizeof(dge));
    memset(fa,0,sizeof(fa));
    for(ll i=1;i<=n*m;i++) fa[i]=i;
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=m;j++){
            if(i+1<=n && abs(a[i*m+j]-a[i*m-m+j])<=x){
                he(find(i*m+j),find(i*m-m+j));
            }
            if(j+1<=m && abs(a[i*m-m+j+1]-a[i*m-m+j])<=x){
                he(find(i*m-m+j+1),find(i*m-m+j));
            }
        }
    }
    bool flag=false;
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=m;j++){
            if(f[i*m+j-m]){
                if(!flag){
                    flag=true;
                    x=find(i*m-m+j);
                }
                if(find(i*m-m+j)!=x) return false;
            }
        }
    }
    return true;
}
int main(){
    cin>>n>>m;
    ll ans=0,l=0,r=0;
    for(ll i=1;i<=n;i++) for(ll j=1;j<=m;j++){
        cin>>a[i*m-m+j];
        r=max(r,a[i*m-m+j]);
    }
    ll mid=(l+r)/2;
    for(ll i=1;i<=n;i++) for(ll j=1;j<=m;j++) cin>>f[i*m-m+j];
    while(l<=r){
        mid=(l+r)/2;
        if(cheak(mid)){
            r=mid-1;
            ans=r;
        }else{
            l=mid+1;
        }
    }
    cout<<ans;
    return 0;
} 
2023/4/15 12:56
加载中...