Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("O3")
- #include <bits/stdc++.h>
- using namespace std;
- using ll = long long;
- #define pb emplace_back
- #define AI(i) begin(i), end(i)
- template<class T> bool chmin(T &a, T b) { return b < a && (a = b, true); }
- template<class T> bool chmax(T &a, T b) { return a < b && (a = b, true); }
- #ifdef KEV
- #define DE(args...) kout("[ " + string(#args) + " ] = ", args)
- void kout() { cerr << endl; }
- template<class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ', kout(b...); }
- template<class T> void debug(T l, T r) { while (l != r) cerr << *l << " \n"[next(l)==r], ++l; }
- #else
- #define DE(...) 0
- #define debug(...) 0
- #endif
- const int MAX_N = 1010;
- int grid[MAX_N][MAX_N];
- int dp[MAX_N][MAX_N], pf[MAX_N][MAX_N], up[MAX_N];
- int solve() {
- int n, m;
- cin >> n >> m;
- for (int i = 1;i <= n;++i) {
- for (int j = 1;j <= m;++j)
- cin >> grid[i][j];
- }
- int res = 1;
- for (int i = 1;i <= n;++i) for (int j = 1;j <= m;++j) {
- pf[i][j] = pf[i-1][j] + pf[i][j-1] - pf[i-1][j-1] + (grid[i][j] == 1);
- if (grid[i][j] == 1) {
- dp[i][j] = 0;
- continue;
- }
- if (dp[i][j-1] == dp[i-1][j]) {
- int d = dp[i][j-1];
- if (d == 0) dp[i][j] = 1;
- else {
- if (grid[i - d][j - d] == 0)
- dp[i][j] = d + 1;
- else
- dp[i][j] = d;
- }
- } else dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + 1;
- chmax(res, dp[i][j]);
- }
- for (int i = 1;i <= n;++i) up[i] = 0;
- for (int i = 1;i <= n;++i) {
- int f = 0;
- for (int j = 1;j <= m;++j) {
- int a = 0;
- auto valid = [&](int a) {
- return pf[i][j] - pf[i-a][j] - pf[i][j-a] + pf[i-a][j-a] <= 1;
- };
- if (grid[i][j] == 1) {
- if (dp[i-1][j] == dp[i][j-1]) {
- a = dp[i-1][j];
- if (grid[i-a][j-a] == 0 || a == 0) ++a;
- } else {
- a = min(dp[i-1][j], dp[i][j-1]) + 1;
- }
- f = j;
- up[j] = i;
- } else {
- vector<int> v{dp[i-1][j-1] + 2, j - f+1, i - up[j]+1};
- sort(AI(v));
- if (v[0] == v[1]) {
- a = v[0] - 1;
- } else a = v[1] - 1;
- }
- if (!valid(a)) --a;
- chmax(res, a);
- }
- }
- return res;
- }
- int32_t main() {
- ios_base::sync_with_stdio(0), cin.tie(0);
- int T;
- cin >> T;
- while (T--)
- cout << solve() << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement