Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define task "MAXR"
- #include <iostream>
- #include <cstdio>
- using namespace std;
- using ll = long long;
- using ld = long double;
- template <class T>
- void readInt(T &x)
- {
- x = 0;
- register int c;
- while ((c = getchar()) && (c > '9' || c < '0'))
- ;
- for (; c >= '0' && c <= '9'; c = getchar())
- x = x * 10 + c - '0';
- }
- constexpr int N = 5e3 + 5;
- int m, n;
- int a[N][N], f[N][N];
- int b[N * 2][N * 2];
- void Read()
- {
- // cin >> m >> n;
- readInt(m), readInt(n);
- for (int i = 1; i <= m; ++i)
- for (int j = 1; j <= n; ++j)
- // cin >> a[i][j];
- readInt(a[i][j]);
- }
- int S(int k)
- {
- // 1 3 5 ... 2k + 1 ... 5 3 1
- return k * (2 * k) + 2 * k + 1;
- }
- int Get(int x, int y, int z, int t)
- {
- return b[z][t] - b[x - 1][t] - b[z][y - 1] + b[x - 1][y - 1];
- }
- int Get(int i, int j, int k)
- {
- int x = i + j - 1,
- y = i + n - j;
- return Get(x - k, y - k, x + k, y + k);
- }
- void Solve()
- {
- for (int i = 1; i <= m; ++i)
- for (int j = 1; j <= n; ++j)
- b[i + j - 1][i + (n - j)] = a[i][j];
- for (int i = 1; i <= m + n - 1; ++i)
- for (int j = 1; j <= m + n - 1; ++j)
- b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];
- int ans(0);
- for (int i = 1; i <= m; ++i)
- for (int j = 1; j <= n; ++j)
- {
- f[i][j] = min(f[i - 1][j] + 1, f[i][j - 1] + 1);
- f[i][j] = min(f[i][j], min(i - 1, j - 1));
- f[i][j] = min(f[i][j], min(m - i, n - j));
- while (f[i][j] && Get(i, j, f[i][j]) != S(f[i][j]))
- --f[i][j];
- ans = max(ans, f[i][j]);
- }
- cout << ans;
- }
- int32_t main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- if (fopen(task ".INP", "r"))
- {
- freopen(task ".INP", "r", stdin);
- freopen(task ".OUT", "w", stdout);
- }
- Read();
- Solve();
- }
Advertisement