제출 #1038353

#제출 시각아이디문제언어결과실행 시간메모리
1038353amine_arouaJoker (BOI20_joker)C++17
0 / 100
209 ms23228 KiB
#include<bits/stdc++.h> using namespace std; #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #pragma GCC target("avx2") vector<pair<int ,int>> edges; struct DSU { vector<int> e; vector<int> col; vector<vector<int>> children; bool bip; vector<vector<int>> hist; void init(int n) { bip = 1; e.assign(n , -1); col.assign(n , 0); children.assign(n , {}); for(int i = 0 ; i < n ;i++) { e[i] = i; children[i].push_back(i); } } int get(int x) { return e[x]; } bool is_bip() { return bip; } void unite(int u , int v) { if(u == v) return ; bool same_col = col[u] == col[v]; u = get(u) , v = get(v); if(u == v) { hist.push_back({-1 , -1 , -1 , -1 ,same_col ,bip}); if(same_col) { bip = 0; } return ; } if((int)children[u].size() < (int)children[v].size()) { swap(u , v); } hist.push_back({u , v , e[u] , e[v] ,same_col, bip}); while(!children[v].empty()) { auto node = children[v].back(); children[v].pop_back(); e[node] = u; col[node]^=same_col; children[u].push_back(node); } } void roll_back() { auto last = hist.back(); hist.pop_back(); if(last[0] == -1) { bip = last.back(); } else { for(int i = 0 ; i < (-last[3]) ; i++) { auto tp = children[last[0]].back(); children[last[0]].pop_back(); e[tp] = last[1]; children[last[1]].push_back(tp); col[tp]^=last[4]; } } } void roll_back(int x) { while (x--) { roll_back(); } } void clear() { roll_back((int)hist.size()); } }dsu; int n , m , q; vector<int> nxt; void solve(int l , int r , int optl , int optr) { if(l > r) return ; int mid = (l + r)/2; int ops = 0; for(int i = l ; i < mid ; i++) { ops++; dsu.unite(edges[i].first , edges[i].second); } int opt = optr; for(int i = optr ; i >= max(mid , optl) ; i--) { if(!dsu.is_bip()) { break; } opt = i; if(i < m) { ops++; dsu.unite(edges[i].first , edges[i].second); } } nxt[mid] = opt; dsu.roll_back(ops); ops = 0; for(int i = opt + 1 ; i <= optr ;i++) { if(i < m) { dsu.unite(edges[i].first , edges[i].second); ops++; } } solve(l , mid - 1 , optl , opt); dsu.roll_back(ops); ops = 0; for(int i = l ; i <= mid ; i++) { ops++; dsu.unite(edges[i].first , edges[i].second); } solve(mid + 1 , r , opt , optr); dsu.roll_back(ops); ops = 0; } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m>>q; nxt.assign(m , m); dsu.init(n); for(int i = 0 ; i < m ; i++) { int u , v; cin>>u>>v; u-- , v--; edges.push_back({u , v}); } solve(0 , m - 1 , 0 , m); for(int i = 0 ; i< q; i++) { int l , r; cin>>l>>r; l-- , r--; if(nxt[l] <= r) { cout<<"NO\n"; } else { cout<<"YES\n"; } } }
#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...