제출 #1269842

#제출 시각아이디문제언어결과실행 시간메모리
1269842DJ035The Kingdom of JOIOI (JOI17_joioi)C++20
0 / 100
1 ms576 KiB
#include <bits/stdc++.h>
#define sanic ios_base::sync_with_stdio(0)
#define x first
#define y second
#define all(v) v.begin(), v.end()
using namespace std;
using ll = long long;
using pi = pair<ll, ll>;
const ll MEM = 2002;
const ll MOD = 1000000007;
const ll INF = 9e17;
ll gcd(ll a, ll b)
{
    if (a % b)
        return gcd(b, a % b);
    return b;
}
ll t, n, m, l;
ll a[MEM][MEM];
ll dpu[MEM][MEM], dpd[MEM][MEM], mnu[MEM][MEM], mnd[MEM][MEM], mxu[MEM][MEM], mxd[MEM][MEM];
int main()
{
    sanic;
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
    for (int j = 1; j <= m; j++)
    {
        mxu[1][j] = mnu[1][j] = a[1][j];
        mxd[n][j] = mnd[n][j] = a[n][j];
        for (int i = 2; i <= n; i++)
        {
            mxu[i][j] = max(mxu[i - 1][j], a[i][j]);
            mnu[i][j] = min(mnu[i - 1][j], a[i][j]);
        }
        for (int i = n - 1; i > 0; i--)
        {
            mxd[i][j] = max(mxd[i + 1][j], a[i][j]);
            mnd[i][j] = min(mnd[i + 1][j], a[i][j]);
        }
    }
    for (int i = 0; i <= n; i++)
        dpu[i][1] = max(mxu[i][1] - mnu[i][1], mxd[i + 1][1] - mnd[i + 1][1]);

    for (int j = 2; j <= m; j++)
    {
        ll o = INF;
        for (int i = 0; i <= n; i++)
        {
            o = min(dpu[i][j - 1], o);
            dpu[i][j] = max(o, max(mxu[i][j] - mnu[i][j], mxd[i + 1][j] - mnd[i + 1][j]));
        }
    }
    for (int i = n + 1; i > 0; i--)
        dpd[i][1] = max(mxu[i - 1][1] - mnu[i - 1][1], mxd[i][1] - mnd[i][1]);

    for (int j = 2; j <= m; j++)
    {
        ll o = INF;
        for (int i = n + 1; i > 0; i--)
        {
            o = min(dpd[i][j - 1], o);
            dpd[i][j] = max(o, max(mxu[i - 1][j] - mnu[i - 1][j], mxd[i][j] - mnd[i][j]));
        }
    }
    ll ans = INF;
    for (int i = 0; i <= n; i++)
        ans = min(ans, dpu[i][m]);
    for (int i = 1; i <= n + 1; i++)
        ans = min(ans, dpd[i][m]);
    cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...