제출 #1276534

#제출 시각아이디문제언어결과실행 시간메모리
1276534jioungJoker (BOI20_joker)C++20
0 / 100
147 ms13824 KiB
#include <bits/stdc++.h> using namespace std; using namespace chrono; #define io ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define fi first #define se second #define eb emplace_back #define endl '\n' typedef long long ll; typedef pair<int, int> pii; const int INF = 1e9; const int MOD = 998244353; const int MAXN = 4e5 + 5; const int MAXM = 2e5 + 5; int lab[MAXN]; int n, m, q; pii ed[MAXM]; vector<tuple<int, int, int, int, bool>> history; void Init() { for (int i = 1; i <= 2 * n; i++) lab[i] = -1; history.clear(); } int Find (int u) { if (lab[u] < 0) return u; return Find(lab[u]); } int snapshot () { return (int)history.size(); } bool biparte = false; void Union (int u, int v) { int ru = Find(u), rv = Find(v); if (ru != rv) { if (lab[ru] > lab[rv]) swap(ru, rv); history.eb(ru, lab[ru], rv, lab[rv], biparte); lab[ru] += lab[rv]; lab[rv] = ru; if (Find(u) == Find(u + n)) biparte = true; // if (Find(v) == Find(v + n)) biparte = true; } } void rollback(int snap) { while (history.size() > snap) { auto [ru, lru, rv, lrv, bip] = history.back(); history.pop_back(); lab[ru] = lru; lab[rv] = lrv; biparte = bip; } } int ans[MAXM]; void calc (int L, int R, int optL, int optR) { if (L > R) return; int mid = (L + R) >> 1; int snap = snapshot(); for (int i = L; i < mid; i++) { Union(ed[i].fi, ed[i].se + n); Union(ed[i].se, ed[i].fi + n); } if (biparte == true) { for (int i = mid; i <= R; i++) ans[i] = m + 1; rollback(snap); calc(L, mid - 1, optL, optR); return; } ans[mid] = optL; for (int i = optR; i >= max(mid, optL); i--) { Union(ed[i].fi, ed[i].se + n); Union(ed[i].se, ed[i].fi + n); if (biparte == true) { ans[mid] = i; break; } } rollback(snap); int snap2 = snapshot(); for (int i = L; i <= mid; i++) { Union(ed[i].fi, ed[i].se + n); Union(ed[i].se, ed[i].fi + n); } calc(mid + 1, R, ans[mid], optR); rollback(snap2); int snap3 = snapshot(); for (int i = optR; i >= max(mid, optL); i--) { Union(ed[i].fi, ed[i].se + n); Union(ed[i].se, ed[i].fi + n); } calc(L, mid - 1, optL, ans[mid]); rollback(snap3); } void solve() { cin >> n >> m >> q; for (int i = 1; i <= m; i++) { cin >> ed[i].fi >> ed[i].se; } Init(); calc(1, m, 1, m); while (q --) { int l, r; cin >> l >> r; if(ans[l] > r) cout << "YES\n"; else cout << "NO\n"; } } int main() { io; solve(); 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...