Submission #1308712

#TimeUsernameProblemLanguageResultExecution timeMemory
1308712Born_To_LaughJoker (BOI20_joker)C++17
0 / 100
2 ms3384 KiB
// Born_To_Laugh - Hughie Do
#include <bits/stdc++.h>
#define alle(AC) AC.begin(), AC.end()
#define fi first
#define se second
using namespace std;
typedef long long ll;
[[maybe_unused]] const ll MOD = 998244353, INF = 1e9 + 7;

const int maxn = 2e5 + 10;
int n, m, q;
vector<pair<int, int>> edges(maxn);
vector<pair<int, int>> query(maxn);

struct DSU
{
    vector<int> par;
    vector<int> sz;
    int n;
    void init(int len){
        n = len;
        par.assign(n + 1, 0);
        sz.assign(n + 1, 1);
        for(int i=1; i<=n; ++i){
            par[i] = i;
        }
    }
    int Head_Set(int a){
        if(a == par[a])return a;
        return par[a] = Head_Set(par[a]);
    }
    void Union_Set(int a, int b){
        a = Head_Set(a);
        b = Head_Set(b);
        if(a == b)return;
        if(sz[a] < sz[b])swap(a, b);
        par[b] = a;
        sz[a] += sz[b];
    }
    bool same_set(int a, int b){
        return Head_Set(a) == Head_Set(b);
    }
};

namespace sub34
{
    vector<int> ans;
    vector<vector<pair<int, int>>> qr;
    vector<pair<int, int>> val;
    
    bool check(){
        for(int i=1; i<=q; ++i){
            if(query[i].fi > 200)return 0;
        }
        return 1;
    }
    void ope(int l){
        DSU dsu;
        dsu.init(2 * n + 5);

        bool ok = 0;
        for(int i=1; i<l; ++i){
            int a = edges[i].fi;
            int b = edges[i].se;
            dsu.Union_Set(val[a].fi, val[b].se);
            dsu.Union_Set(val[a].se, val[b].fi);
            if(dsu.same_set(val[a].fi, val[a].se) || dsu.same_set(val[b].fi, val[b].se)){
                ok = 1;
            }
        }
        int id = m;
        for(auto &cc: qr[l]){
            while(id > cc.fi){
                int a = edges[id].fi;
                int b = edges[id].se;
                dsu.Union_Set(val[a].fi, val[b].se);
                dsu.Union_Set(val[a].se, val[b].fi);
                if(dsu.same_set(val[a].fi, val[a].se) || dsu.same_set(val[b].fi, val[b].se)){
                    ok = 1;
                }
                id--;
            }
            ans[cc.se] = ok;
        }
    }
    void solve(){
        qr.assign(m + 1, vector<pair<int, int>>());
        val.assign(n + 1, {0, 0});
        ans.assign(q + 1, 0);

        for(int i=1; i<=n; ++i){
            val[i].fi = i;
            val[i].se = i + n;
        }
        for(int i=1; i<=q; ++i){
            int l = query[i].fi;
            int r = query[i].se;
            qr[l].push_back({r, i});
        }
        for(int i=1; i<=min(200, n); ++i){
            sort(alle(qr[i]), greater<>());
            ope(i);
        }
        for(int i=1; i<=q; ++i){
            if(ans[i])cout << "YES\n";
            else cout << "NO\n";
        }
    }
};

namespace sub5
{
    vector<vector<int>> adj;
    vector<int> col;
    bool bfs(int a){
        deque<int> bfs;
        col[a] = 1;
        bfs.push_back(a);

        while(!bfs.empty()){
            int x = bfs.front();
            bfs.pop_front();
            for(auto &elm: adj[x]){
                if(col[elm] != 0 && col[elm] != 3 - col[x]){
                    return 1;
                }
                if(col[elm] == 0){
                    col[elm] = 3 - col[x];
                    bfs.push_back(elm);
                }
            }
        }
        return 0;
    }
    bool ope(int l, int r){
        adj.assign(n + 1, vector<int>());
        col.assign(n + 1, 0);

        for(int i=1; i<l; ++i){
            int a = edges[i].fi;
            int b = edges[i].se;
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
        for(int i=r + 1; i<=m; ++i){
            int a = edges[i].fi;
            int b = edges[i].se;
            adj[a].push_back(b);
            adj[b].push_back(a);
        }

        for(int i=1; i<=n; ++i){
            if(col[i] != 0)continue;
            if(bfs(i)){
                return 1;
            }
        }
        return 0;
    }
    void solve(){
        for(int i=1; i<=q; ++i){
            int l = query[i].fi;
            int r = query[i].se;
            if(ope(l, r))cout << "YES\n";
            else cout << "NO\n";
        }
    }
};

void solve(){
    cin >> n >> m >> q;
    for(int i=1; i<=m; ++i){
        cin >> edges[i].fi >> edges[i].se;
    }
    for(int i=1; i<=q; ++i){
        cin >> query[i].fi >> query[i].se;
    }
    if(sub34::check())sub34::solve();
    else sub5::solve();
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
#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...