제출 #1313212

#제출 시각아이디문제언어결과실행 시간메모리
1313212rythm_of_knightPassport (JOI23_passport)C++17
48 / 100
2105 ms256136 KiB
#include <bits/stdc++.h>
#define ar array
#define all(x) x.begin(), x.end()
using namespace std;
typedef long long ll;

const int N = 2e5 + 5;
const int inf = 1e9;
int mn[20][N], mx[20][N], L[N], R[N], res[N];
map <ar <int, 2>, int> mp;

int getmx(int l, int r) {
    int lg = __lg(r - l + 1);
    return max(mx[lg][l], mx[lg][r - (1 << lg) + 1]);
}

int getmn(int l, int r) {
    int lg = __lg(r - l + 1);
    return min(mn[lg][l], mn[lg][r - (1 << lg) + 1]);
}

struct segtree {
    vector <int> t;
    int n;
    segtree (int sz) {
        n = sz++;
        t.assign(sz << 2, inf);
    }
    int qi, qx, ql, qr;
    void update(int v, int l, int r) {
        if (l == r)
            return t[v] = qx, void();
        int m = l + r >> 1;
        if (qi <= m)
            update(v << 1, l, m);
        else
            update(v << 1 | 1, m + 1, r);
        t[v] = min(t[v << 1], t[v << 1 | 1]);
    }
    void update(int i, int x) {
        qi = i, qx = x;
        update(1, 1, n);
    }
    int get(int v, int l, int r) {
        if (ql <= l && r <= qr)
            return t[v];
        if (ql > r || l > qr)
            return inf;
        int m = l + r >> 1;
        return min(get(v << 1, l, m), get(v << 1 | 1, m + 1, r));
    }
    int get(int l, int r) {
        ql = l, qr = r;
        return get(1, 1, n);
    }
};
segtree st(N);

int get(int l, int r) {
    if (mp.count({l, r}))
        return mp[{l, r}];
    int tl = getmn(l, r), tr = getmx(l, r), ans = inf;
    if (tl < l) {
        ans = min(ans, get(tl, r) + 1);
        ans = min(ans, st.get(tl, l - 1) + 1);
    }
    if (r < tr) {
        ans = min(ans, get(l, tr) + 1);
        ans = min(ans, st.get(r + 1, tr) + 1);
    }
    return mp[{l, r}] = ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n;
    cin >> n;
    vector <ar <int, 2>> b;
    for (int i = 1; i <= n; i++) {
        res[i] = inf;
        cin >> L[i] >> R[i];
        mn[0][i] = L[i];
        mx[0][i] = R[i];
        b.push_back({R[i] - L[i], i});
    }
    for (int i = 1; i < 20; i++) {
        for (int j = 1; j + (1 << i) - 1 <= n; j++) {
            int m = j + (1 << i - 1);
            mn[i][j] = min(mn[i - 1][j], mn[i - 1][m]);
            mx[i][j] = max(mx[i - 1][j], mx[i - 1][m]);
        }
    }
    mp[{1, n}] = 0;
    sort(all(b));
    reverse(all(b));
    for (auto cur : b) {
        int i = cur[1];
        res[i] = get(L[i], R[i]) + 1;
        res[i] = min(res[i], st.get(L[i], R[i]) + 1);
        st.update(i, res[i]);
    }
    for (int i = 1; i <= n; i++)
        if (res[i] == inf + 1)
            res[i] = -1;
    int q;
    cin >> q;
    while (q--) {
        int x;
        cin >> x;
        cout << res[x] << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...