Submission #1014666

#TimeUsernameProblemLanguageResultExecution timeMemory
1014666MODDIJoker (BOI20_joker)C++14
49 / 100
2065 ms24524 KiB
#include <bits/stdc++.h>
using namespace std;

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")

using pii = pair<int, int>;

struct DSU {
    int n;
    vector<pii> par;
    vector<int> size, bi;

    DSU(int _n) {
        n = _n;
        par.resize(n+1);
        size.resize(n+1, 1);
        bi.resize(n+1, 1);
        for(int i=1; i<=n; i++) par[i] = { i, 0 };
    }

    pii find(int u) {
        if(u == par[u].first) return par[u];
        int p = par[u].second;
        par[u] = find(par[u].first);
        par[u].second ^= p;
        return par[u];
    }

    bool uni(int a, int b) {
        auto pa = find(a), pb = find(b);

        if(pa.first == pb.first) {
            if(pa.second == pb.second) bi[pa.first] = 0;
            return 0;
        }

        if(size[pa.first] < size[pb.first]) swap(pa, pb);
        size[pa.first] += size[pb.first];
        par[pb.first] = { pa.first, pa.second ^ pb.second ^ 1 };
        bi[pa.first] &= bi[pb.first];

        return 1;
    }

    int getBi(int u) { return bi[find(u).first]; }

    void reset() {
        for(int i=1; i<=n; i++) {
            par[i] = { i, 0 };
            size[i] = 1;
            bi[i] = 1;
        }
    }
};

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

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

    vector<array<int, 2> > edges(m+1);
    for(int i=1; i<=m; i++) cin >> edges[i][0] >> edges[i][1];

    if(n <= 2000 && m <= 2000 && q <= 2000) {
        while(q--) {
            int l, r;
            cin >> l >> r;

            DSU dsu(n);
            int bi = 1;
            for(int i=1; i<=m; i++) {
                if(l <= i && i <= r) continue;
                dsu.uni(edges[i][0], edges[i][1]);
                if(!dsu.getBi(edges[i][0])) {
                    bi = 0;
                    break;
                }
            }

            cout << (bi ? "NO" : "YES") << '\n';
        }

        return 0;
    }

    int mx = 0;
    vector<int> ans(q);
    vector<int> qus[m+1];
    vector<pii> qus2[m+1];
    for(int i=0; i<q; i++) {
        int l, r;
        cin >> l >> r;
        mx = max(mx, l);
        qus[r].push_back(i);
        qus2[l].push_back({ r, i });
    }

    if(mx == 1) {
        DSU dsu(n);
        int bi = 1;
        for(int i=m; i>=1; i--) {
            for(int &id : qus[i]) ans[id] = bi;
            dsu.uni(edges[i][0], edges[i][1]);
            if(!dsu.getBi(edges[i][0])) bi = 0;
        }

        for(int &x : ans) cout << (x ? "NO" : "YES") << '\n';
        return 0;
    }

    int bi2=1;
    DSU dsu(n);
    for(int i=1; i<=mx; i++) {
        if(qus2[i].size() == 0) continue;
        if(bi2 == 0) continue;

        sort(qus2[i].begin(), qus2[i].end());
        int bi = 1, p = qus2[i].size() - 1;
        dsu.reset();

        for(int j=1; j<i&&bi2; j++) {
            dsu.uni(edges[j][0], edges[j][1]);
            if(!dsu.getBi(edges[j][0])) {
                bi = 0;
                bi2 = 0;
                break;
            }
        }

        if(!bi2) bi = 0;
        for(int j=m; j>=i&&bi; j--) {
            while(p >= 0 && qus2[i][p].first == j) {
                ans[qus2[i][p].second] = bi;
                p--;
            }

            dsu.uni(edges[j][0], edges[j][1]);
            if(!dsu.getBi(edges[j][0])) bi = 0;
        }

    }

    for(int &x : ans) cout << (x ? "NO" : "YES") << '\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...