Submission #1249811

#TimeUsernameProblemLanguageResultExecution timeMemory
1249811mr_finCurtains (NOI23_curtains)C++17
0 / 100
1525 ms18164 KiB
#include <bits/stdc++.h>
using namespace std;

// --- segment tree supporting point‐update max and prefix‐max query ---
struct SegTree {
    int n;
    vector<int> st;
    SegTree(int _n): n(_n), st(4*n+4, 0) {}
    void update(int p, int val, int idx=1, int l=1, int r=-1) {
        if (r<0) r = n;
        if (l==r) {
            st[idx] = max(st[idx], val);
            return;
        }
        int mid = (l+r)>>1;
        if (p <= mid) update(p, val, idx<<1, l, mid);
        else          update(p, val, idx<<1|1, mid+1, r);
        st[idx] = max(st[idx<<1], st[idx<<1|1]);
    }
    // return max over [L..R]
    int query(int L, int R, int idx=1, int l=1, int r=-1) {
        if (r<0) r = n;
        if (R < l || r < L)       return 0;
        if (L <= l && r <= R)     return st[idx];
        int mid = (l+r)>>1;
        return max(
            query(L, R, idx<<1, l, mid),
            query(L, R, idx<<1|1, mid+1, r)
        );
    }
};

struct Curtain { int l, r; };
struct Query   { int s, e, idx; };

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

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

    vector<Curtain> A(m);
    for (int i = 0; i < m; i++)
        cin >> A[i].l >> A[i].r;

    vector<Query> Q(q);
    for (int i = 0; i < q; i++) {
        cin >> Q[i].s >> Q[i].e;
        Q[i].idx = i;
    }

    // sort curtains by r ascending
    sort(A.begin(), A.end(),
         [](auto &a, auto &b){ return a.r < b.r; });

    // sort queries by e ascending
    vector<Query> byE = Q;
    sort(byE.begin(), byE.end(),
         [](auto &a, auto &b){ return a.e < b.e; });

    SegTree st(n);
    vector<bool> ans(q);
    int p = 0;
    for (auto &qj : byE) {
        // add all curtains with r <= qj.e
        while (p < m && A[p].r <= qj.e) {
            st.update(A[p].l, A[p].r);
            p++;
        }
        // greedy cover [s..e]
        int cur = qj.s;
        bool ok = true;
        while (cur <= qj.e) {
            int bestR = st.query(1, cur);
            if (bestR < cur) {
                ok = false;
                break;
            }
            cur = bestR + 1;
        }
        ans[qj.idx] = ok;
    }

    // output in original order
    for (int i = 0; i < q; i++)
        cout << (ans[i] ? "YES\n" : "NO\n");

    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...