제출 #1010834

#제출 시각아이디문제언어결과실행 시간메모리
1010834VMaksimoski008Joker (BOI20_joker)C++17
39 / 100
2037 ms42656 KiB
#include <bits/stdc++.h>
using namespace std;

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,bmi,bmi2,lzcnt,popcnt")

using pii = pair<int, int>;

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

    void init(int _n) {
        n = _n + 1;
        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;
        auto p2 = find(par[u].first);
        return { p2.first, p2.second ^ p };
    }

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

        st.push_back({ bi[pa.first], bi[pb.first] });
        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);

        st.push_back({ size[pa.first], size[pa.first] });
        st.push_back({ par[pa.first].first, par[pa.first].first });
        st.push_back({ par[pa.first].second, par[pa.first].second });

        size[pa.first] += size[pb.first];
        par[pb.first] = { pa.first, pa.second ^ pb.second ^ 1 };
        bi[pa.first] &= bi[pb.first];

        return 1;
    }

    void roll(int sz) {
        while(st.size() > sz) {
            st.back().first = st.back().second;
            st.pop_back();
        }
    }

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

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

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

    vector<array<int, 2> > edges(m);
    for(auto &[a, b] : edges) cin >> a >> b;

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

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

            cout << (!ans ? "YES" : "NO") << '\n';
        }
        
        return 0;
    }

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

    vector<bool> ans(q);
    for(int it=0; it<200; it++) {
        if(qus[it].empty()) continue;
        sort(qus[it].rbegin(), qus[it].rend());

        int p = 0, ok = 1;
        DSU dsu; dsu.init(n);
        for(int i=0; i<it; i++) {
            dsu.uni(edges[i][0], edges[i][1]);
            if(!dsu.getBi(edges[i][0])) ok = 0;
        }

        for(int i=m-1; i>=0&&ok; i--) {
            while(p < qus[it].size() && qus[it][p].first == i) {
                ans[qus[it][p].second] = ok;
                p++;
            }

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

    for(int i=0; i<q; i++)
        cout << (!ans[i] ? "YES" : "NO") << '\n';
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

Joker.cpp: In member function 'void DSU::roll(int)':
Joker.cpp:53:25: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int&, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   53 |         while(st.size() > sz) {
      |               ~~~~~~~~~~^~~~
Joker.cpp: In function 'int main()':
Joker.cpp:115:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |             while(p < qus[it].size() && qus[it][p].first == i) {
      |                   ~~^~~~~~~~~~~~~~~~
#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...