Submission #1315972

#TimeUsernameProblemLanguageResultExecution timeMemory
1315972eldorbek_008Pinball (JOI14_pinball)C++20
100 / 100
413 ms62264 KiB
#include <bits/stdc++.h>
using namespace std;

#define int int64_t

const int N = 3e5 + 1;
const int inf = 1e18;

struct segtree {
    vector<int> t;

    segtree() {
        t.assign(4 * N, inf);
    };

    void update(int v, int l, int r, int i, int x) {
        if (l > i or r < i or l > r) {
            return;
        } else if (l == r) {
            t[v] = min(t[v], x);
        } else {
            int m = (l + r) >> 1;
            if (i <= m) {
                update(2 * v, l, m, i, x);
            } else {
                update(2 * v + 1, m + 1, r, i, x);
            }
            t[v] = min(t[2 * v], t[2 * v + 1]);
        }
    }

    int get(int v, int l, int r, int L, int R) {
        if (l > r or L > r or R < l) {
            return inf;
        } else if (L <= l and r <= R) {
            return t[v];
        } else {
            int m = (l + r) >> 1;
            int lt = get(2 * v, l, m, L, R);
            int rt = get(2 * v + 1, m + 1, r, L, R);
            return min(lt, rt);
        }
    }
};

segtree sl, sr;

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

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

    vector<int> l(m + 1), r(m + 1), c(m + 1), w(m + 1), mn(m + 1), mx(m + 1);
    vector<vector<int>> dp(m + 1, vector<int>(2));

    for (int i = 0; i < m; i++) {
        cin >> l[i] >> r[i] >> c[i] >> w[i];
    }
    int ans = 1e18;

    map<int, int> mp;
    set<int> st;
    st.insert(1);
    st.insert(n);
    for (int i = 0; i < m; i++) {
        st.insert(l[i]);
        st.insert(r[i]);
        st.insert(c[i]);
    }
    int i = 0;
    for (int j : st) {
        mp[j] = i + 1;
        i++;
    }
    int sz = i;
    sl.update(1, 1, sz, mp[1], 0);
    sr.update(1, 1, sz, mp[n], 0);
    for (int i = 0; i < m; i++) {
        int lx = mp[l[i]];
        int rx = mp[r[i]];
        int k = mp[c[i]];
        int val = w[i];

        int cl = sl.get(1, 1, sz, lx, rx);
        int cr = sr.get(1, 1, sz, lx, rx);
        if (cl < inf and cr < inf) {
            ans = min(ans, cl + cr + val);
        }
        if (cl < inf) {
            sl.update(1, 1, sz, k, cl + val);
        }
        if (cr < inf) {
            sr.update(1, 1, sz, k, cr + val);
        }
    }

    if (ans == 1e18) {
        cout << -1; 
    } else {
        cout << ans;
    }

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