Submission #705807

#TimeUsernameProblemLanguageResultExecution timeMemory
705807piOOESightseeing in Kyoto (JOI22_kyoto)C++17
100 / 100
462 ms26744 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using db = double;

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

    int n, m;
    cin >> n >> m;

    vector<int> a(n), b(m);

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

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

    set<tuple<db, int, int>> st;

    set<int> rows, columns;

    vector<int> last(n + m);

    int iter = 0;

    for (int i = 0; i < n; ++i) {
        rows.insert(rows.end(), i);
    }

    for (int i = 0; i < m; ++i) {
        columns.insert(columns.end(), i);
    }

    for (int i = 0; i < n - 1; ++i) {
        st.emplace(a[i + 1] - a[i], i, 0);
    }

    for (int i = n; i < n + m - 1; ++i) {
        st.emplace(b[i + 1 - n] - b[i - n], i, 0);
    }

    vector<int> when(n + m, -1);

    while (!st.empty()) {
        auto [delta, i, iteration] = *st.begin();
        st.erase(st.begin());

        if (last[i] != iteration) {
            continue;
        }

        when[i] = ++iter;

//        cout << i << endl;


        if (i >= n) {
            auto it = columns.erase(columns.find(i - n));

            if (it != columns.begin()) {
                assert(it != columns.end());
                int j = *it, p = *prev(it);
                assert(j > i - n);

                st.emplace(db(b[j] - b[p]) / (j - p), p + n, last[p + n] = iter);
            }
        } else {
            auto it = rows.erase(rows.find(i));

            if (it != rows.begin()) {
                assert(it != rows.end());
                int j = *it, p = *prev(it);
                assert(j > i);

                st.emplace(db(a[j] - a[p]) / (j - p), p, last[p] = iter);
            }
        }
    }

    int x = 0, y = 0;
    ll ans = 0;

    while (x < n - 1 || y < m - 1) {
        if (x < n - 1 && (y == m - 1 || when[x] < when[y + n])) {
            ans += b[y];
            x += 1;
        } else {
            ans += a[x];
            y += 1;
        }
    }

    cout << ans << endl;

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