Submission #1223102

#TimeUsernameProblemLanguageResultExecution timeMemory
1223102overwatch9Experimental Charges (NOI19_charges)C++20
100 / 100
23 ms6268 KiB
#include <bits/stdc++.h> using namespace std; struct DSU { vector <int> link, sz, charge; vector <vector <int>> adj; DSU (int n) { link = sz = charge = vector <int> (n+1); adj.resize(n+1); for (int i = 1; i <= n; i++) { link[i] = i; charge[i] = 1; sz[i] = 1; } } int head(int x) { if (link[x] == x) return x; return head(link[x]); } bool same(int a, int b) { return head(a) == head(b); } void unite(int a, int b, bool attract) { if (same(a, b)) return; if (sz[head(a)] < sz[head(b)]) swap(a, b); if ((attract && charge[a] == charge[b]) || (!attract && charge[a] != charge[b])) { b = head(b); dfs(b, b); } a = head(a); b = head(b); link[b] = a; sz[a] += sz[b]; adj[a].push_back(b); adj[b].push_back(a); } void dfs(int s, int p) { charge[s] = 1 - charge[s]; for (auto i : adj[s]) { if (i == p) continue; dfs(i, s); } } }; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; DSU dsu(n+1); for (int i = 0; i < q; i++) { char mode; int a, b; cin >> mode >> a >> b; if (mode == 'Q') { if (dsu.same(a, b)) { if (dsu.charge[a] == dsu.charge[b]) cout << "R\n"; else cout << "A\n"; } else { cout << "?\n"; } } else { if (mode == 'A') dsu.unite(a, b, true); else dsu.unite(a, b, false); } } }
#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...