Submission #1299026

#TimeUsernameProblemLanguageResultExecution timeMemory
1299026thieunguyenhuyJoker (BOI20_joker)C++20
100 / 100
304 ms9704 KiB
#include <bits/stdc++.h> using namespace std; #define POPCOUNT(n) (__builtin_popcountll((n))) #define CLZ(n) (__builtin_clzll((n))) #define CTZ(n) (__builtin_ctzll((n))) #define LOG(n) (63 - __builtin_clzll((n))) #define BIT(n, i) (((n) >> (i)) & 1ll) #define MASK(i) (1ll << (i)) #define FLIP(n, i) ((n) ^ (1ll << (i))) #define ON(n, i) ((n) | MASK(i)) #define OFF(n, i) ((n) & ~MASK(i)) #define Int __int128 #define fi first #define se second typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<int, int> pii; typedef pair<long long, long long> pll; typedef pair<long long, int> pli; typedef pair<int, long long> pil; typedef vector<pair<int, int>> vii; typedef vector<pair<long long, long long>> vll; typedef vector<pair<long long, int>> vli; typedef vector<pair<int, long long>> vil; template <class T1, class T2> bool maximize(T1 &x, T2 y) { if (x < y) { x = y; return true; } return false; } template <class T1, class T2> bool minimize(T1 &x, T2 y) { if (x > y) { x = y; return true; } return false; } template <class T> void remove_duplicate(vector<T> &ve) { sort (ve.begin(), ve.end()); ve.resize(unique(ve.begin(), ve.end()) - ve.begin()); } mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); long long random(long long l, long long r) { return uniform_int_distribution<long long>(l, r)(rng); } unsigned long long random(unsigned long long l, unsigned long long r) { return uniform_int_distribution<unsigned long long>(l, r)(rng); } template <class T> T random(T r) { return rng() % r; } const int N = 1e6 + 5; const int MOD = 1e9 + 7; const int inf = 1e9; const long long INF = 1e18; int n, m, q; int bestR[N]; pii edges[N]; int CLONE(int u) { return (u <= n ? u + n : u - n); } struct DSU { vector<int> par, sz; vii ve; bool existOdd; DSU() {} void resize(int n) { existOdd = false; ve.clear(); sz.assign(n + 1, 1); par.assign(n + 1, 0); for (int i = 1; i <= n; ++i) par[i] = i; } int find_set(int p) { return par[p] == p ? p : find_set(par[p]); } bool same_set(int u, int v) { return find_set(u) == find_set(v); } bool join(int u, int v) { u = find_set(u), v = find_set(v); if (u != v) { if (sz[u] < sz[v]) swap(u, v); ve.emplace_back(v, existOdd); sz[u] += sz[v], par[v] = u; existOdd |= same_set(u, CLONE(u)); existOdd |= same_set(v, CLONE(v)); return true; } return false; } void addEdge(int u, int v) { join(u, CLONE(v)); join(v, CLONE(u)); // existOdd |= same_set(u, CLONE(u)); // existOdd |= same_set(v, CLONE(v)); } void rollback(int checkpoint) { while (ve.size() > checkpoint) { auto [v, odd] = ve.back(); ve.pop_back(); sz[par[v]] -= sz[v], par[v] = v, existOdd = odd; } } } dsu; void addEdge(int id) { auto [u, v] = edges[id]; dsu.addEdge(u, v); // dsu.join(u, CLONE(v)); // dsu.join(v, CLONE(u)); } void dnc(int l, int r, int optL, int optR) { if (l > r) return; int mid = (l + r) >> 1; int checkpoint1 = dsu.ve.size(); for (int i = l; i < mid; ++i) addEdge(i); // cerr << "mid bestodd " << mid << ' ' << dsu.existOdd << '\n'; int &optMid = bestR[mid]; optMid = optR; int checkpoint2 = dsu.ve.size(); while (optMid > mid && !dsu.existOdd) addEdge(--optMid); // cerr << "mid = " << mid << ' ' << optMid << '\n'; dsu.rollback(checkpoint2); addEdge(mid); dnc(mid + 1, r, optMid, optR); dsu.rollback(checkpoint1); for (int i = optR - 1; i >= optMid; --i) addEdge(i); dnc(l, mid - 1, optL, optMid); } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m >> q; for (int i = 1; i <= m; ++i) { int u, v; cin >> u >> v; edges[i] = make_pair(u, v); } dsu.resize(n + n); // for (int i = 1; i <= 3; ++i) addEdge(i); // cerr << dsu.existOdd << '\n'; dnc(1, m, 1, m + 1); for (int i = 1; i <= q; ++i) { int l, r; cin >> l >> r; if (r < bestR[l]) 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...