제출 #703431

#제출 시각아이디문제언어결과실행 시간메모리
703431piOOESightseeing in Kyoto (JOI22_kyoto)C++17
40 / 100
373 ms1048576 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int h, w;
    cin >> h >> w;

    vector<int> a(h), b(w);

    for (int i = 0; i < h; ++i) {
        cin >> a[i];
    }

    for (int j = 0; j < w; ++j) {
        cin >> b[j];
    }

    constexpr int inf = 1e9 + 7;

    vector<int> pref(h + 1, inf), suf(h + 1, inf);

    vector<int> rows, columns;

    for (int i = 0; i < h; ++i) {
        pref[i + 1] = min(pref[i], a[i]);
    }

    for (int i = h - 1; i >= 0; --i) {
        suf[i] = min(a[i], suf[i + 1]);
    }

    for (int i = 0; i < h; ++i) {
        if (pref[i] > a[i] || suf[i + 1] > a[i]) {
            rows.push_back(i);
        }
    }

    pref.assign(w + 1, inf), suf.assign(w + 1, inf);

    for (int i = 0; i < w; ++i) {
        pref[i + 1] = min(pref[i], b[i]);
    }

    for (int i = w - 1; i >= 0; --i) {
        suf[i] = min(b[i], suf[i + 1]);
    }

    for (int i = 0; i < w; ++i) {
        if (pref[i] > b[i] || suf[i + 1] > b[i]) {
            columns.push_back(i);
        }
    }

    int n = rows.size(), m = columns.size();

    vector dp(n, vector<ll>(m));

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (i == 0 && j == 0) {
                continue;
            }

            dp[i][j] = 1e18;

            if (i > 0) {
                dp[i][j] = dp[i - 1][j] + 1LL * b[columns[j]] * (rows[i] - rows[i - 1]);
            }

            if (j > 0) {
                dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1LL * a[rows[i]] * (columns[j] - columns[j - 1]));
            }
        }
    }

    cout << dp[n - 1][m - 1] << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...