Submission #522263

#TimeUsernameProblemLanguageResultExecution timeMemory
522263blueExperimental Charges (NOI19_charges)C++17
100 / 100
26 ms3356 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int mx = 100'000; using vi = vector<int>; using pii = pair<int, int>; struct disjoint_set { vector<pii> parent = vector<pii>(1+mx); vi subtree = vi(1+mx, 1); vi flip = vi(1+mx, 0); disjoint_set() { for(int i = 1; i <= mx; i++) parent[i] = {i, 0}; } pii root(int u) { if(parent[u].first == u) return {u, 0}; else { pii pr = root(parent[u].first); pr.second ^= parent[u].second; parent[u] = pr; return pr; } } void join(int u, int v, bool b) { pii up = root(u), vp = root(v); if(up.first == vp.first) return; if(subtree[up.first] < subtree[vp.first]) swap(up, vp); subtree[up.first] += subtree[vp.first]; parent[vp.first] = {up.first, b ^ up.second ^ vp.second}; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int N, Q; cin >> N >> Q; disjoint_set DS; for(int q = 1; q <= Q; q++) { char T; int A, B; cin >> T >> A >> B; if(T == 'A') DS.join(A, B, 1); else if(T == 'R') DS.join(A, B, 0); else { pii AP = DS.root(A), BP = DS.root(B); if(AP.first != BP.first) cout << "?\n"; else if(AP.second == BP.second) cout << "R\n"; else cout << "A\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...