제출 #438680

#제출 시각아이디문제언어결과실행 시간메모리
438680soroushJoker (BOI20_joker)C++17
39 / 100
146 ms10968 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int , int> pii; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int maxn = 2e5+10; const ll mod = 1e9+7; #define pb push_back #define endl '\n' #define dokme(x) cout << x , exit(0) #define ms(x , y) memset(x , y , sizeof x) ll pw(ll a, ll b, ll md = mod){ll res = 1;while(b){if(b&1){res=(a*res)%md;}a=(a*a)%md;b>>=1;}return(res);} int n, m, q; int a[maxn], b[maxn], l[maxn], r[maxn]; int par[maxn], sz[maxn]; bool val[maxn]; int getpar(int v){ return ((~par[v]) ? getpar(par[v]) : v); } bool getval(int v){ return ((~par[v]) ? val[v] ^ getval(par[v]) : val[v]); } bool merge(int v, int u){ int pu = getpar(u) , pv = getpar(v); if(pu == pv) return getval(u) == getval(v); if(sz[pu] > sz[pv])swap(pu , pv); val[pu] ^= getval(v) == getval(u); par[pu] = pv; sz[pv] += sz[pu]; return 0; } bool solve(int l , int r){ for(int i = 0 ; i < l ; i ++){ if(merge(a[i], b[i])){ if(i > n){ for(int j = 0 ; j < n ; j ++) par[j] = -1, val[j] = 0, sz[j] = 1; } else{ for(int j = 0; j <= i ; j ++) par[a[j]] = par[b[j]] = -1 , val[a[j]] = val[b[j]] = 0 , sz[a[j]] = sz[b[j]] = 1; } return 1; } } for(int i = r ; i < m ; i ++){ if(merge(a[i], b[i])){ if(l + i - r > n){ for(int j = 0 ; j < n ; j ++) par[j] = -1, val[j] = 0 , sz[j] = 1; } else{ for(int j = 0; j < l ; j ++) par[a[j]] = par[b[j]] = -1 , val[a[j]] = val[b[j]] = 0 , sz[a[j]] = sz[b[j]] = 1; for(int j = r ; j <= i ; j ++) par[a[j]] = par[b[j]] = -1 , val[a[j]] = val[b[j]] = 0 , sz[a[j]] = sz[b[j]] = 1; } return 1; } } if(m - r - l < n){ for(int j = 0; j < l ; j ++) par[a[j]] = par[b[j]] = -1 , val[a[j]] = val[b[j]] = 0 , sz[a[j]] = sz[b[j]] = 1; for(int j = r ; j < m ; j ++) par[a[j]] = par[b[j]] = -1 , val[a[j]] = val[b[j]] = 0 , sz[a[j]] = sz[b[j]] = 1; } else{ for(int j = 0 ; j < n ; j ++) par[j] = -1, val[j] = 0 , sz[j] = 1; } return 0; } bool sub3 = 0; int srt[maxn]; bool ans[maxn]; int32_t main(){ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); cin >> n >> m >> q; ms(par, -1); for(int i = 0 ; i < m ; i ++) cin >> a[i] >> b[i] , a[i] -- , b[i] --; for(int i = 0 ; i < n ; i ++)sz[i] = 1; for(int i = 0 ; i < q ; i ++) cin >> l[i] >> r[i], l[i] --, sub3 |= l[i]; if(n <= 2000 and m <= 2000 and q <= 2000){ for(int i = 0 ; i < q ; i ++) cout << (solve(l[i] , r[i]) ? "YES" : "NO") << endl; return 0; } if(!sub3){ for(int i = 0 ; i < q ; i ++) srt[i] = i; sort(srt , srt + q , [](int i, int j){return r[i] > r[j];}); bool cur = 0; int pos = m-1; for(int i = 0 ; i < q ; i ++){ while(pos >= r[srt[i]]){ cur |= merge(a[pos], b[pos]); pos --; } ans[srt[i]] = cur; } for(int i = 0 ; i < q ; i ++) cout << ((ans[i]) ? "YES" : "NO") << endl; return 0; } 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...