Submission #885537

#TimeUsernameProblemLanguageResultExecution timeMemory
885537huutuanJoker (BOI20_joker)C++14
100 / 100
425 ms35900 KiB
#include<bits/stdc++.h> #define taskname "nohome" using namespace std; struct DSU{ vector<int> lab, val; bool ans=1; vector<vector<pair<int, int>>> changes; void init(int n){ lab.assign(n+1, -1); val.assign(n+1, 0); } pair<int, int> find_set(int u){ if (lab[u]<0) return {u, 0}; auto p=find_set(lab[u]); return {p.first, val[u]^p.second}; } void union_sets(int u, int v){ if (!u || !v) return; auto pu=find_set(u), pv=find_set(v); if (pu.first!=pv.first){ if (lab[pu.first]>lab[pv.first]) swap(pu, pv), swap(u, v); changes.push_back({{pu.first, lab[pu.first]}, {pv.first, lab[pv.first]}, {pu.first, val[pu.first]}, {pv.first, val[pv.first]}}); lab[pu.first]+=lab[pv.first]; val[pu.first]=0; lab[pv.first]=pu.first; val[pv.first]=pu.second^pv.second^1; }else changes.push_back({{ans, -1}}), ans&=pu.second^pv.second; } void rollback(int sz){ while ((int)changes.size()>sz){ if (changes.back().size()==1){ ans=changes.back()[0].first; }else{ for (int i=0; i<2; ++i) lab[changes.back()[i].first]=changes.back()[i].second; for (int i=2; i<4; ++i) val[changes.back()[i].first]=changes.back()[i].second; } changes.pop_back(); } } } dsu; const int N=2e5+1; int n, m, q, ans[N], mx[N]; pair<int, int> edge[N]; void dnc(int l, int r, int optl, int optr){ if (l>r) return; int mid=(l+r)>>1; int sz=dsu.changes.size(); int idx=optr; for (int i=l; i<mid; ++i) dsu.union_sets(edge[i].first, edge[i].second); int sz2=dsu.changes.size(); while (dsu.ans && idx>=optl){ dsu.union_sets(edge[idx].first, edge[idx].second); --idx; } mx[mid]=idx; dsu.rollback(sz2); dsu.union_sets(edge[mid].first, edge[mid].second); dnc(mid+1, r, idx, optr); dsu.rollback(sz); for (int i=idx+1; i<=optr; ++i) dsu.union_sets(edge[i].first, edge[i].second); dnc(l, mid-1, optl, idx); dsu.rollback(sz); } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); // freopen(taskname".inp", "r", stdin); // freopen(taskname".out", "w", stdout); cin >> n >> m >> q; for (int i=1; i<=m; ++i){ int x, y; cin >> x >> y; edge[i]={x, y}; } dsu.init(n); dnc(1, m, 0, m); for (int i=1; i<=q; ++i){ int l, r; cin >> l >> r; cout << (mx[l]>=r?"YES\n":"NO\n"); } 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...