제출 #1321717

#제출 시각아이디문제언어결과실행 시간메모리
1321717M_W_13Sightseeing in Kyoto (JOI22_kyoto)C++20
0 / 100
0 ms332 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define st first
#define nd second
#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(a) a.begin(), a.end()
const ll INF = 1e18;

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n, m;
    cin >> n >> m;
    ll A[n];
    ll B[m];
    rep(i, n) cin >> A[i];
    rep(i, m) cin >> B[i];
    vector<ll> ma;
    vector<ll> xma;
    vector<ll> mb;
    vector<ll> xmb;
    ll last = INF;
    int x1 = -1;
    rep(i, n) {
        if (last >= A[i]) {
            ma.pb(A[i]);
            xma.pb(i);
            last = A[i];
            x1 = i;
        }
    }
    int y1 = -1;
    last = INF;
    rep(i, m) {
        if (last >= B[i]) {
            mb.pb(B[i]);
            xmb.pb(i);
            last = B[i];
            y1 = i;
        }
    }
    vector<ll> ra;
    vector<ll> xra;
    vector<ll> rb;
    vector<ll> xrb;
    last = INF;
    for (int i = n - 1; i >= x1; i--) {
        if (last >= A[i]) {
            ra.pb(A[i]);
            xra.pb(i);
            last = A[i];
        }
    }
    last = INF;
    for (int i = m - 1; i >= y1; i--) {
        if (last >= B[i]) {
            rb.pb(B[i]);
            xrb.pb(i);
            last = B[i];
        }
    }
    ll ans = 0;
    int it1 = 0;
    int it2 = 0;
    int sza = ma.size();
    int szb = mb.size();
    while (it1 < (sza - 1) || it2 < (szb - 1)) {
        if (it1 == (sza - 1)) {
            ans += (ma[it1] * (xmb[it2 + 1] - xmb[it2]));
            it2++;
        }
        else if (it2 == (szb - 1)) {
            ans += (mb[it2] * (xma[it1 + 1] - xma[it1]));
            it1++;
        }
        else {
            ll dla = xma[it1 + 1] - xma[it1];
            ll dlb = xmb[it2 + 1] - xmb[it2];
            ll poma = ma[it1] * dlb + mb[it2 + 1] * dla;
            ll pomb = mb[it2] * dla + ma[it1 + 1] * dlb;
            if (poma <= pomb) {
                ans += (ma[it1] * dlb);
                it2++;
            }
            else {
                ans += (mb[it2] * dla);
                it1++;
            }
        }
    }
    sza = ra.size();
    szb = rb.size();
    it1 = 0;
    it2 = 0;
    while (it1 < (sza - 1) || it2 < (szb - 1)) {
        if (it1 == (sza - 1)) {
            ans += (ra[it1] * (xrb[it2] - xrb[it2 + 1]));
            it2++;
        }
        else if (it2 == (szb - 1)) {
            ans += (rb[it2] * (xra[it1] - xra[it1 + 1]));
            it1++;
        }
        else {
            ll dla = abs(xra[it1 + 1] - xra[it1]);
            ll dlb = abs(xrb[it2 + 1] - xrb[it2]);
            ll poma = ra[it1] * dlb + rb[it2 + 1] * dla;
            ll pomb = rb[it2] * dla + ra[it1 + 1] * dlb;
            if (poma <= pomb) {
                ans += (ra[it1] * dlb);
                it2++;
            }
            else {
                ans += (rb[it2] * dla);
                it1++;
            }
        }
    }
    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...