Advertisement
Kevin_Zhang

Untitled

Aug 5th, 2023
964
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #pragma GCC optimize("O3")
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. using ll = long long;
  5. #define pb emplace_back
  6. #define AI(i) begin(i), end(i)
  7. template<class T> bool chmin(T &a, T b) { return b < a && (a = b, true); }
  8. template<class T> bool chmax(T &a, T b) { return a < b && (a = b, true); }
  9. #ifdef KEV
  10. #define DE(args...) kout("[ " + string(#args) + " ] = ", args)
  11. void kout() { cerr << endl; }
  12. template<class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ', kout(b...); }
  13. template<class T> void debug(T l, T r) { while (l != r) cerr << *l << " \n"[next(l)==r], ++l; }
  14. #else
  15. #define DE(...) 0
  16. #define debug(...) 0
  17. #endif
  18. const int MAX_N = 1010;
  19. int grid[MAX_N][MAX_N];
  20. int dp[MAX_N][MAX_N], pf[MAX_N][MAX_N], up[MAX_N];
  21. int solve() {
  22.   int n, m;
  23.   cin >> n >> m;
  24.   for (int i = 1;i <= n;++i) {
  25.     for (int j = 1;j <= m;++j)
  26.       cin >> grid[i][j];
  27.   }
  28.   int res = 1;
  29.   for (int i = 1;i <= n;++i) for (int j = 1;j <= m;++j) {
  30.     pf[i][j] = pf[i-1][j] + pf[i][j-1] - pf[i-1][j-1] + (grid[i][j] == 1);
  31.     if (grid[i][j] == 1) {
  32.       dp[i][j] = 0;
  33.       continue;
  34.     }
  35.     if (dp[i][j-1] == dp[i-1][j]) {
  36.       int d = dp[i][j-1];
  37.       if (d == 0) dp[i][j] = 1;
  38.       else {
  39.         if (grid[i - d][j - d] == 0)
  40.           dp[i][j] = d + 1;
  41.         else
  42.           dp[i][j] = d;
  43.       }
  44.     } else dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + 1;
  45.     chmax(res, dp[i][j]);
  46.   }
  47.   for (int i = 1;i <= n;++i) up[i] = 0;
  48.  
  49.   for (int i = 1;i <= n;++i) {
  50.     int f = 0;
  51.     for (int j = 1;j <= m;++j) {
  52.       int a = 0;
  53.       auto valid = [&](int a) {
  54.         return pf[i][j] - pf[i-a][j] - pf[i][j-a] + pf[i-a][j-a] <= 1;
  55.       };
  56.       if (grid[i][j] == 1) {
  57.         if (dp[i-1][j] == dp[i][j-1]) {
  58.           a = dp[i-1][j];
  59.           if (grid[i-a][j-a] == 0 || a == 0) ++a;
  60.         } else {
  61.           a = min(dp[i-1][j], dp[i][j-1]) + 1;
  62.         }
  63.         f = j;
  64.         up[j] = i;
  65.       } else {
  66.         vector<int> v{dp[i-1][j-1] + 2, j - f+1, i - up[j]+1};
  67.         sort(AI(v));
  68.         if (v[0] == v[1]) {
  69.           a = v[0] - 1;
  70.         } else a = v[1] - 1;
  71.       }
  72.       if (!valid(a)) --a;
  73.       chmax(res, a);
  74.     }
  75.   }
  76.   return res;
  77. }
  78. int32_t main() {
  79.     ios_base::sync_with_stdio(0), cin.tie(0);
  80.   int T;
  81.   cin >> T;
  82.   while (T--)
  83.     cout << solve() << '\n';
  84. }
  85.  
  86.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement