제출 #993852

#제출 시각아이디문제언어결과실행 시간메모리
993852FatonimJoker (BOI20_joker)C++17
36 / 100
2019 ms31716 KiB
// "We create our own demons." #include <bits/stdc++.h> using namespace std; #ifdef ONPC #include "debug.h" #else #define dbg(...) #endif #define int long long #define ll long long #define ld long double #define pi pair<int, int> // vector #define sz(a) (int)((a).size()) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define maxel(x) (*max_element(all(x))) #define minel(x) (*min_element(all(x))) #define maxpos(x) (max_element(all(x)) - x.begin()) #define minpos(x) (min_element(all(x)) - x.begin()) #define srt(x) (sort(all(x))) #define rev(x) (reverse(all(x))) // bitwise operations #define cnt_bit(n) __builtin_popcountll(n) #define low_bit(n) ((n) & (-(n))) #define bit(n, i) (((n) >> (i)) & 1) #define set_bit(n, i) ((n) | (1LL << (i))) #define reset_bit(n, i) ((n) & ~(1LL << (i))) #define flip_bit(n, i) ((n) ^ (1LL << (i))) // math #define sqr(n) ((n) * (n)) #define divup(a, b) (((a) + (b)-1) / (b)) // ostream #define Fixed(a) cout << fixed << setprecision(12) << a; template <class T> void chmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; } template <class T> void chmax(T& a, const T& b) { return b > a ? a = b, 1 : 0; } template <class T> using min_queue = priority_queue<T, vector<T>, greater<T>>; template <class T> using max_queue = priority_queue<T, vector<T>, less<T>>; template <class T> using V = vector<T>; using vi = V<int>; using vd = V<ld>; using vb = V<bool>; using vpi = V<pi>; using vvi = V<vi>; using vvb = V<vb>; const int mod = 1e9 + 7; // 998244353 1e9 + 7 const ll inf = (int)(1e18) + 7; const int inf_s = 1e9 + 7; const ld eps = 1e-9; const int B = 32; const int N = 1000 + 3; const int logn = 20; const int maxn = 4e5 + 7; /////////////////////////solve///////////////////////// const int bs = 4500; const int bc = maxn / bs + 1; struct query { int l, r, i; }; V<query> b[maxn]; pi e[maxn]; int ans[maxn]; int p[maxn], sz[maxn], len[maxn]; vi hist; pi get(int a) { if (a != p[a]) { pi cur = get(p[a]); return {cur.first, cur.second ^ len[a]}; } return {a, 0}; } bool unite(int aa, int bb) { auto [a, x] = get(aa); auto [b, y] = get(bb); if (a == b) { dbg(a, b, aa, bb); dbg(p[aa], p[bb]); return x ^ y ^ 1; } if (sz[a] > sz[b]) swap(a, b); sz[b] += sz[a]; p[a] = b; len[a] = x ^ y ^ 1; hist.push_back(a); return 0; } void rb(int k) { while (sz(hist) > k) { int a = hist.back(); hist.pop_back(); sz[p[a]] -= sz[a]; p[a] = a; len[a] = 0; } } void solve() { int n, m, q; cin >> n >> m >> q; for (int i = 0; i < n; ++i) { sz[i] = 1; p[i] = i; len[i] = 0; } for (int i = 0; i < m; ++i) { int v, u; cin >> v >> u; --v; --u; e[i] = {v, u}; e[i + m] = {v, u}; } for (int qi = 0; qi < q; ++qi) { int l, r; cin >> l >> r; --l, --r; int nl = r + 1, nr = m + l - 1; b[nl / bs].push_back({nl, nr, qi}); } for (int bi = 0; bi < bc; ++bi) { sort(all(b[bi]), [](query& a, query& b) {return a.r < b.r;}); int st = (bi + 1) * bs; int cur_r = st; int res = 0; for (auto& [l, r, qi] : b[bi]) { dbg(bi, qi, l, r, res); while (cur_r <= r) { res |= unite(e[cur_r].first, e[cur_r].second); ++cur_r; dbg(e[cur_r], cur_r); } int k = sz(hist), add = 0; for (int i = l; i <= min(r, st - 1); ++i) { add |= unite(e[i].first, e[i].second); dbg(e[i], i); } dbg(res, add); rb(k); ans[qi] = res | add; } rb(0); } for (int qi = 0; qi < q; ++qi) { cout << (ans[qi] ? "YES" : "NO") << "\n"; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #ifdef ONPC freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); freopen("error.txt", "w", stderr); #endif int t = 1; //cin >> t; for (int i = 1; i <= t; ++i) { #ifdef ONPC cerr << "===========" << i << "===========" << '\n'; #endif solve(); } #ifdef ONPC cerr << endl << "Time " << clock() * 1.0 / CLOCKS_PER_SEC << " sec" << endl; #endif }
#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...