Submission #870689

# Submission time Handle Problem Language Result Execution time Memory
870689 2023-11-08T21:31:08 Z EJIC_B_KEDAX Sightseeing in Kyoto (JOI22_kyoto) C++17
0 / 100
0 ms 348 KB
#ifdef LOCAL
    #define _GLIBCXX_DEBUG
#endif
#include <bits/stdc++.h>

#ifndef LOCAL
    // #pragma GCC optimize("O3")
    // #pragma GCC optimize("Ofast")
    // #pragma GCC optimize("unroll-loops")
    // #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt")
#endif
using namespace std;
using ll = long long;
using ld = long double;
#define x first
#define y second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()



mt19937_64 mt(time(0));

void solve();
void init();

int32_t main() {
#ifndef LOCAL
    cin.tie(nullptr)->sync_with_stdio(false);
#else
    freopen("input.txt", "r", stdin);
#endif
    init();
    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
}

void init() {}

void solve() {
    int h, w;
    cin >> h >> w;
    vector<pair<ll, ll>> a1(h), b1(w), a, b, af, bf, as, bs;
    for (int i = 0; i < h; i++) {
        cin >> a1[i].x;
        a1[i].y = 1;
    }
    for (int i = 0; i < w; i++) {
        cin >> b1[i].x;
        b1[i].y = 1;
    }
    for (int i = 0; i < h; i++) {
        while (a.size() >= 3) {
            auto ff = a.back();
            a.pop_back();
            if (!(a1[i].x <= ff.x && a.back().x <= ff.x)) {
                a.push_back(ff);
                break;
            } else {
                a.back().y += ff.y;
            }
        }
        a.push_back(a1[i]);
    }
    for (int i = 0; i < w; i++) {
        while (b.size() >= 3) {
            auto ff = b.back();
            b.pop_back();
            if (!(b1[i].x <= ff.x && b.back().x <= ff.x)) {
                b.push_back(ff);
                break;
            } else {
                b.back().y += ff.y;
            }
        }
        b.push_back(b1[i]);
    }
    ll ans = 0;
    h = a.size();
    w = b.size();
    af.push_back(a[0]);
    bf.push_back(b[0]);
    for (int i = 1; i < h; i++) {
        if (a[i] > a[i - 1]) {
            as.push_back(a[i]);
        } else {
            af.push_back(a[i]);
        }
    }
    for (int i = 1; i < w; i++) {
        if (b[i] > b[i - 1]) {
            bs.push_back(b[i]);
        } else {
            bf.push_back(b[i]);
        }
    }
    a = af;
    b = bf;
    h = a.size();
    w = b.size();
    vector<vector<ll>> dp(h + 1, vector<ll>(w + 1, INT64_MAX));
    dp[0][0] = 0;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + b[j].x * a[i].y);
            dp[i][j + 1] = min(dp[i][j + 1], dp[i][j] + a[i].x * b[j].y);
        }
    }
    ans += dp[h - 1][w - 1];
    a = as;
    b = bs;
    h = a.size();
    w = b.size();
    dp.resize(h + 1);
    dp[0].resize(w + 1);
    dp[0][0] = 0;
    for (int i = 0; i < h; i++) {
        dp[i + 1].resize(w + 1);
        for (int j = 0; j < w; j++) {
            dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + b[j].x * a[i].y);
            dp[i][j + 1] = min(dp[i][j + 1], dp[i][j] + a[i].x * b[j].y);
        }
    }
    ans += dp[h - 1][w - 1];
    cout << ans << '\n';
}
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -