Submission #1249616

#TimeUsernameProblemLanguageResultExecution timeMemory
1249616garrinCurtains (NOI23_curtains)C++20
9 / 100
1596 ms2952 KiB
#include <bits/stdc++.h>
using namespace std;

bool sub1(int st, int end, vector<pair<int, int>>& cur) {
    int n = end - st + 1;
    if (n > 20) return false;
    int mt = (1 << n) - 1;
    vector<int> cmask;
    for (auto& i : cur) {
        int mask = 0;
        for (int pos = max(i.first, st); pos <= min(i.second, end); pos++) {
            mask |= (1 << (pos - st));
        }
        if (mask > 0) {
            cmask.push_back(mask);
        }
    }
    vector<bool> dp(1 << n, false);
    dp[0] = true;
    for (int mask = 0; mask < (1 << n); mask++) {
        if (!dp[mask]) continue;
        for (int iMask : cmask) {
            int newMask = mask | iMask;
            dp[newMask] = true;
        }
    }
    return dp[mt];
}

bool sub2(int st, int end, vector<pair<int, int>>& cur) {
    if (st > end) return true;
    if (cur.empty()) return false;
    sort(cur.begin(), cur.end());
    int current = st;
    int i = 0;
    while (current <= end) {
        int furr = current - 1;
        while (i < cur.size() && cur[i].first <= current) {
            if (cur[i].second >= current) {
                furr = max(furr, cur[i].second);
            }
            i++;
        }
        if (furr < current) {
            return false;
        }
        current = furr + 1;
    }
    return true;
}

bool sub0(int st, int end, vector<pair<int, int>>& cur) {
    int m = cur.size();
    if (m > 15) return false;
    for (int mask = 0; mask < (1 << m); mask++) {
        vector<bool> vc(end - st + 1, false);
        for (int i = 0; i < m; i++) {
            if (mask & (1 << i)) {
                for (int pos = cur[i].first; pos <= cur[i].second; pos++) {
                    if (pos >= st && pos <= end) {
                        vc[pos - st] = true;
                    }
                }
            }
        }
        bool ktra = true;
        for (int i = 0; i < vc.size(); i++) {
            if (!vc[i]) {
                ktra = false;
                break;
            }
        }
        if (ktra) return true;
    }
    return false;
}

bool solve(int st, int end, vector<pair<int, int>>& allcur) {
    vector<pair<int, int>> vli;
    for (auto& i : allcur) {
        if (i.first >= st && i.second <= end) {
            vli.push_back(i);
        }
    }
    int side = end - st + 1;
    int numcur = vli.size();
    if (numcur <= 15 && side <= 20) {
        return sub0(st, end, vli);
    }
    if (side <= 20) {
        return sub1(st, end, vli);
    }
    return sub2(st, end, vli);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n, m, q;
    cin >> n >> m >> q;
    vector<pair<int, int>> cur(m);
    for (int i = 0; i < m; i++) {
        cin >> cur[i].first >> cur[i].second;
    }
    for (int i = 0; i < q; i++) {
        int s, e;
        cin >> s >> e;
        cout << (solve(s, e, cur) ? "YES" : "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...