Submission #1279762

#TimeUsernameProblemLanguageResultExecution timeMemory
1279762rtriJoker (BOI20_joker)C++20
0 / 100
171 ms8248 KiB
#include <bits/stdc++.h> using namespace std; int n, m, q; int l, r; struct UF { vector<int> sz, p, lazy, value; UF(int n) : sz(n, 1), p(n, -1), lazy(n, 0), value(n, 0) {} bool get_color(int a) { value[a] = (value[a] + lazy[a]) % 2; if (0 <= p[a]) lazy[p[a]] = (lazy[p[a]] + lazy[a]) % 2; lazy[a] = 0; return value[a]; } int find(int a) { get_color(a); return p[a] < 0 ? a : p[a] = find(p[a]); } void join(int a, int b) { int u = find(a), v = find(b); if (u == v) return; if (sz[u] < sz[v]) swap(u, v); p[v] = u; sz[u] += sz[v]; if (value[v] == value[u]) lazy[v] = 1; } }; int main() { cin >> n >> m >> q; vector<pair<int, int>> edg; for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; edg.push_back({a, b}); } vector<tuple<int, int, int>> queries; for (int i = 0; i < q; i++) { cin >> l >> r; l--; r--; queries.push_back({l, r, i}); } sort(queries.rbegin(), queries.rend()); UF uf(n); vector<bool> ans(q); int prev_r = m; bool works = false; for (auto [l, r, idx] : queries) { for (int i = r; i < prev_r; i++) { auto [a, b] = edg[i]; if (uf.find(a) == uf.find(b) && uf.get_color(a) == uf.get_color(b)) works = true; uf.join(a, b); } ans[idx] = works; prev_r = r; } for (int i = 0; i < q; i++) if (ans[i]) cout << "YES\n"; else cout << "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...