Submission #475784

#TimeUsernameProblemLanguageResultExecution timeMemory
475784blueJoker (BOI20_joker)C++17
14 / 100
2096 ms6620 KiB
#include <iostream> #include <vector> #include <stack> #include <cassert> using namespace std; struct disjoint_set { int N; vector<int> parent; vector<int> parent_edge; vector<int> subtree; stack<int> ops; stack<bool> bipartite; disjoint_set() { ; } disjoint_set(int N_) { N = N_; parent = vector<int>(1+N); parent_edge = vector<int>(1+N); subtree = vector<int>(1+N); for(int i = 0; i <= N; i++) { parent[i] = i; parent_edge[i] = 0; subtree[i] = 1; } ops.push(0); bipartite.push(1); } void join(int u, int v) { int opp = 1; while(u != parent[u]) { opp ^= parent_edge[u]; u = parent[u]; } while(v != parent[v]) { opp ^= parent_edge[v]; v = parent[v]; } if(u == v) { ops.push(0); if(bipartite.top()) { if(opp == 0) bipartite.push(1); else bipartite.push(0); } else bipartite.push(0); } else { if(subtree[u] < subtree[v]) swap(u, v); parent[v] = u; parent_edge[v] = opp; subtree[u] += subtree[v]; ops.push(v); bipartite.push( bipartite.top() ); } } void rollback() { int u = ops.top(); ops.pop(); bipartite.pop(); subtree[ parent[u] ] -= subtree[u]; parent[u] = u; parent_edge[u] = 0; } bool is_bipartite() { return bipartite.top(); } }; const int maxN = 200'000; const int maxM = 200'000; int N, M, Q; vector<int> u(1+maxM), v(1+maxM); int main() { cin >> N >> M >> Q; for(int j = 1; j <= M; j++) cin >> u[j] >> v[j]; for(int q = 1; q <= Q; q++) { disjoint_set DSU(N); int l, r; cin >> l >> r; for(int i = 1; i <= M; i++) { if(i < l || r < i) DSU.join(u[i], v[i]); } if(DSU.is_bipartite()) cout << "NO\n"; else cout << "YES\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...