제출 #1299022

#제출 시각아이디문제언어결과실행 시간메모리
1299022efegJoker (BOI20_joker)C++20
49 / 100
2095 ms11044 KiB
#include <bits/stdc++.h>
using namespace std; 


#define pb push_back
#define eb emplace_back
#define F first
#define S second

typedef pair<int,int> ii; 

template<typename T>
using vec = vector<T>; 
using i64 = long long; 

struct DSU{
    int n; 
    vec<int> dsu,dist; 
    DSU(int n) : n(n){
        dsu.assign(n,-1);
        dist.assign(n,0);  
    }

    int find(int x){
        
        if (dsu[x] < 0) return x; 
        int old = dsu[x]; 
        dsu[x] = find(old); 
        dist[x] = (dist[x] + dist[old]) & 1; 
        return dsu[x]; 
    }

    bool merge(int x,int y){
        int px = find(x); int py = find(y); 
        if (px == py) {
            if (dist[x] == dist[y]){
                return false; 
            }  
            return true; 
        } 
        if (dsu[px] > dsu[py]) swap(px,py); 
        dsu[px] += dsu[py]; 
        dsu[py] = px; 
        dist[py] = (dist[x] + 1 + dist[y]) & 1; 
        return true; 
    }
}; 

int n,m,q; 
vec<ii> edges; 
vec<vec<ii>> queries; 
vec<bool> ans; 

int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); 
    cin >> n >> m >> q;
    ans.assign(q + 1,false); 
    queries.assign(m,vec<ii>()); 

    for (int i = 0; i < m; i++){
        int a,b; cin >> a >> b; 
        a--; b--; 
        edges.eb(a,b); 
    }

    for (int i = 0; i < q; i++){
        int l,r; cin >> l >> r; 
        l--; r--; 
        queries[l].eb(r,i); 
    }

    for (int l = 0; l < m; l++){
        if (!queries[l].empty()){
            DSU dsu(n+1);
            bool ok = false; 
            for (int i = 0; i < l; i++){
                if (!dsu.merge(edges[i].F,edges[i].S)) ok = true;  
            } 
            
            int idx = m-1;
            while (!ok && idx >= l){
                if (!dsu.merge(edges[idx].F,edges[idx].S)) ok = true; 
                idx--;  
            }

            for (auto tp : queries[l]){
                int r,i; tie(r,i) = tp; 
                if (r <= idx) ans[i] = true;
                else ans[i] = false;  
            }
        }
    }

    for (int i = 0; i < q; i++) cout << (ans[i] ? "YES" : "NO") << endl; 


    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...