30pts求调(
查看原帖
30pts求调(
714084
NightStriker楼主2022/9/19 20:00

rt,#1,#4,#10 AC,其余 WA 。

#include <bits/stdc++.h>
using namespace std;
int vis[501][501],a[1001][1001],op[501][501];
int n,m,ans,s,nx,ny,sx,sy,l,r = 114514000,mid;
int dx[4] = {0,0,-1,1},dy[4] = {-1,1,0,0};
void dfs(int x,int y,int mid) {
	ans += op[x][y];
	for (int i = 0;i < 4;i ++ ) {
		nx = x + dx[i];
		ny = y + dy[i];
		if (nx<1||ny<1||nx>n||ny>m||vis[nx][ny]) continue;
		if (abs(a[x][y] - a[nx][ny]) < mid) {
			vis[nx][ny] = 1;
			dfs(nx,ny,mid);
		}
	}
}
int erfen(){
	while (l < r) {
		memset(vis,0,sizeof vis);
		mid = (l + r) / 2,ans=0;
		vis[sx][sy] = 1;
		dfs(sx,sy,mid);
		if (ans == s) r = mid;
		else l = mid + 1;
	}
	return l-1;
}
int main() {
	cin>>n>>m;
	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 ++ ) {
			cin>>op[i][j];
			if (op[i][j]) {
				sx = i,sy = j;
			}
			s += op[i][j];
		}
	}
	cout<<erfen();
	return 0;
}
2022/9/19 20:00
加载中...