Submission #765447

#TimeUsernameProblemLanguageResultExecution timeMemory
765447oyberJoker (BOI20_joker)C++14
25 / 100
96 ms10180 KiB
#include <cstdio> #include <vector> #include <algorithm> #include <functional> #include <stack> using namespace std; vector<int> u; vector<int> s; vector<int> p; int find(int n) { if (u[n] == n) return n; return find(u[n]); } int parity(int n) { if (u[n] == n) return 0; return parity(u[n])^p[n]; } struct UniteInfo { int a; int b; int sa; }; UniteInfo unite(int a, int b) { int ap = find(a); int bp = find(b); if (s[bp] > s[ap]) { swap(a, b); swap(ap, bp); } u[bp] = ap; s[ap] += s[bp]; if (parity(a) == parity(b)) { p[bp] = 1; } else { p[bp] = 0; } return UniteInfo { ap, bp, s[ap] - s[bp], }; } void undo(UniteInfo info) { u[info.b] = info.b; s[info.a] = info.sa; } struct Query { int l; int r; int i; }; bool comp_query(Query q1, Query q2) { return q1.r > q2.r; } int main() { int n, m, qn; scanf("%d %d %d", &n, &m, &qn); u.resize(n); s.resize(n, 1); p.resize(n); for (int i = 0; i < n; i++) { u[i] = i; } vector<pair<int, int>> e(m); for (int i = 0; i < m; i++) { int a, b; scanf("%d %d", &a, &b); a--;b--; e[i] = make_pair(a, b); //printf("%d %d %d\n", a, b, i); } vector<Query> q(qn); for (int i = 0; i < qn; i++) { int l, r; scanf("%d %d", &l, &r); l--;r--; q[i] = Query{l,r,i}; } sort(q.begin(), q.end(), comp_query); vector<bool> result(qn); int current_r = m-1; bool r_cycle = false; for (int i = 0; i < qn; i++) { if (r_cycle) { result[q[i].i] = true; continue; } int l = q[i].l; int r = q[i].r; //printf("%d: %d %d\n", i, l, r); while (current_r > r) { int a = e[current_r].first; int b = e[current_r].second; //printf("%d %d %d\n", current_r, a, b); if (find(a) == find(b)) { if (parity(a) == parity(b)) { r_cycle = true; break; } } else { unite(a, b); } current_r--; } if (r_cycle) { result[q[i].i] = true; continue; } bool cycle = false; int current_l = 0; stack<UniteInfo> infos; while (current_l < l) { int a = e[current_l].first; int b = e[current_l].second; //printf("%d %d %d\n", current_l, a, b); if (find(a) == find(b)) { if (parity(a) == parity(b)) { cycle = true; break; } } else { infos.push(unite(a, b)); } current_l++; } if (cycle) { result[q[i].i] = true; } while (infos.size() > 0) { undo(infos.top()); infos.pop(); } } for (int i = 0; i < qn; i++) { if (result[i]) { printf("YES\n"); } else { printf("NO\n"); } } }

Compilation message (stderr)

Joker.cpp: In function 'int main()':
Joker.cpp:66:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |     scanf("%d %d %d", &n, &m, &qn);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Joker.cpp:79:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |         scanf("%d %d", &a, &b);
      |         ~~~~~^~~~~~~~~~~~~~~~~
Joker.cpp:88:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |         scanf("%d %d", &l, &r);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#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...