[悬关]死循环
查看原帖
[悬关]死循环
637788
kimi0705楼主2023/7/22 21:19
#include <bits/stdc++.h>
#define int long long
#define db double
using namespace std;
const int N = 1e6 + 10;
vector<int> arr[N], sum[N];
int n, m;
int read() {
	int x;
	scanf("%lld", &x);
	return x;
}
inline int Sum(int X1, int Y1, int X2, int Y2) {
	return sum[X2][Y2] - sum[X2][Y1 - 1] - sum[X1 - 1][Y2] + sum[X1 - 1][Y1 - 1];
}
inline bool check(int k) {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (arr[i][j] >= k) sum[i][j] = 1;
			else sum[i][j] = 0;
		}
	}
	for (int i = 1; i <= n; i++)
		for ( int j = 1; j <= m; j++)
			sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
	for (int i = 1; i + k - 1 <= n; i++) {
		for ( int j = 1; j + k - 1 <= m; j++) {
			int x = i + k - 1;
			int y = j + k - 1;
			int cnt = Sum(i, j, x, y);
			if (cnt == (x - i + 1) * (y - j + 1)) return true;
		}
	}
	return false;
}

signed main() {
	int t = read();
	while (t--) {
		n = read(), m = read();
		for (int i = 1; i <= n; i++) {
			arr[i].resize(m + 10);
			sum[i].resize(m + 10);
			fill(arr[i].begin(), arr[i].end(), 0);
			fill(sum[i].begin(), sum[i].end(), 0);
		}
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) arr[i][j] = read();
		}
		int l = 1, r = n, ans;
		while (l <= r) {
			int mid = l + r >> 1;
			if (check(mid)) l = mid - 1, ans = mid;
			else r = mid + 1;
		}
		cout << ans << '\n';
	}
}
2023/7/22 21:19
加载中...