1 条题解

  • 0
    @ 2026-2-4 21:25:44
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a[1001][1001],fd[4][2]={{1,0},{-1,0},{0,1},{0,-1}},mis[1000001],cnt,mx[1000001];
    struct edge{
    	int x,y,z;
    };
    struct node{
    	int x,y;
    };
    vector<edge>e;
    vector<node>t[1000001];
    int find(int x){
    	return mis[x]==x?x:mis[x]=find(mis[x]);
    }
    void dfs(int x,int fa){
    	for(auto [y,z]:t[x]){
    		if(y==fa) continue;
    		mx[y]=max(mx[x],z);
    		dfs(y,x);
    	}
    }
    int main(){
    	cin>>n>>m;
    	for(int i=1;i<=n*m;i++) mis[i]=i;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			cin>>a[i][j];
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			bool fl=0;
    			for(int k=0;k<4;k++){
    				int tx=i+fd[k][0],ty=j+fd[k][1];
    				if(tx<1||tx>n||ty<1||ty>m){fl=1;continue;}
    				e.push_back({(i-1)*m+j,(tx-1)*m+ty,max(a[i][j],a[tx][ty])});
    			}
    			if(fl) e.push_back({(i-1)*m+j,0,max(0,a[i][j])});
    		}
    	}
    	sort(e.begin(),e.end(),[](edge x,edge y){return x.z<y.z;});
    	for(auto [x,y,z]:e){
    		int fx=find(x),fy=find(y);
    		if(fx!=fy){
    			mis[fx]=fy;
    			t[x].push_back({y,z}),t[y].push_back({x,z});
    			if(++cnt==n*m-1) break;
    		}
    	}
    	dfs(0,-1);
    	for(int i=1;i<=n*m;i++){
    		cout<<max(mx[i]-a[(i-1)/m+1][(i-1)%m+1],0)<<' ';
    		if(i%m==0) cout<<'\n';
    	}
    	return 0;
    }