样例过不了
查看原帖
样例过不了
793625
Pink_Cut_Tree楼主2024/3/7 18:00
#include<bits/stdc++.h>
using namespace std;
const int N=512;
#define ll long long
#define pii pair<int,int>
int m,n;
int h[N][N];
bool lub[N][N];
ll ans;
queue<pii>Q;
int dx[4]={0,-1,0,1},dy[4]={1,0,-1,0};
bool vis[N][N];
int cnt,lcnt;
int sx,sy;
bool bfs(int k){
	while(!Q.empty()){
		Q.pop();
	}
	Q.push({sx,sy});
	while(!Q.empty()){
		int x=Q.front().first,y=Q.front().second; Q.pop();
		
		for(int i=0;i<4;i++){
			int px=x+dx[i],py=y+dy[i];
			if(px>m||py>n||px<1||py<1||vis[px][py]){
				continue;
			}
			if(abs(h[px][py]-h[x][y])<=k){
				Q.push({px,py});
				vis[px][py]=1;
				if(lub[px][py]){
					cnt++;
				}
			}
		}
	}
return lcnt==cnt;
}
int main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>m>>n;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			cin>>h[i][j];
		}
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			cin>>lub[i][j];
			if(lub[i][j]){
				sx=i,sy=j;
				lcnt++;
			}
		}
	}
	ll l=0,r=1e12,ans;
	while(l<=r){
		ll mid=(l+r)>>1;
		memset(vis,0,sizeof vis); cnt=0;
//		cout<<mid<<"\n";
		if(bfs(mid)){
			ans=mid,r=mid-1;
		}
		else{
			l=mid+1;
		}
	}
	cout<<ans;
return 0;
}
2024/3/7 18:00
加载中...