Submission #929166

#TimeUsernameProblemLanguageResultExecution timeMemory
929166Joshua_AnderssonJoker (BOI20_joker)C++14
0 / 100
2052 ms21060 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define int ll const int inf = int(1e18); typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> p2; #define rep(i, high) for (int i = 0; i < high; i++) #define repp(i, low, high) for (int i = low; i < high; i++) #define repe(i, container) for (auto& i : container) #define sz(container) ((int)container.size()) inline void fast() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } struct change { int a, b; int oldpar, oldxor, oldsize; }; struct UF { vector<change> updates; vi size; vi par; vi parity; UF(int n) : size(n, 1), parity(n), par(n) { rep(i, n)par[i] = i; } int find(int x) { return x == par[x] ? x : find(par[x]); } int getparity(int x) { return x == par[x] ? parity[x] : parity[x] ^ getparity(par[x]); } bool oddcycle(int a, int b) { return getparity(a) == getparity(b); } void merge(int a, int b) { if (size[find(a)] < size[find(b)]) swap(a, b); int childa = a; int childb = b; a = find(a); b = find(b); change c({a,b,par[b],parity[b],size[a]}); updates.push_back(c); if (a != b) { parity[b] = getparity(childb) ^ getparity(childa) ^ 1; size[a] += size[b]; par[b] = a; } } void rollback() { change c = updates.back(); updates.pop_back(); par[c.b] = c.oldpar; parity[c.b] = c.oldxor; size[c.a] = c.oldsize; } }; signed main() { fast(); int n, m, q; cin >> n >> m >> q; vector<p2> edgelist; rep(i, m) { int a, b; cin >> a >> b; a--; b--; edgelist.emplace_back(a, b); } //shuffle(edgelist.begin(), prev(edgelist.end()), mt19937(3436876)); UF uf(n); vi right(m, inf); bool anyodd = 0; auto add = [&](int i) { int a, b; tie(a, b) = edgelist[i]; int ret = 0; if (uf.find(a) == uf.find(b)) ret = uf.oddcycle(a, b); uf.merge(a, b); return ret; }; rep(i, m) { int lo = i; int hi = m; while (lo+1<hi) { int mid = (lo + hi) / 2; bool odd = 0; for (int j = m - 1; j >= mid; j--) odd |= add(j); for (int j = m - 1; j >= mid; j--) uf.rollback(); if (odd) lo = mid; else hi = mid; } right[i] = lo; if (anyodd) right[i] = -1; anyodd |= add(i); } //vvi queries(m); while (q--) { int l, r; cin >> l >> r; l--; r--; cout << (r+1<=right[l] ? "YES" : "NO") << "\n"; } return 0; }

Compilation message (stderr)

Joker.cpp: In constructor 'UF::UF(ll)':
Joker.cpp:30:5: warning: 'UF::parity' will be initialized after [-Wreorder]
   30 |  vi parity;
      |     ^~~~~~
Joker.cpp:29:5: warning:   'vi UF::par' [-Wreorder]
   29 |  vi par;
      |     ^~~
Joker.cpp:32:2: warning:   when initialized here [-Wreorder]
   32 |  UF(int n) : size(n, 1), parity(n), par(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...