Submission #1292481

#TimeUsernameProblemLanguageResultExecution timeMemory
1292481chaitanyamehtaLost Array (NOI19_lostarray)C++20
0 / 100
2 ms332 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int, int> struct DSU { vector<int> par; vector<int> size; void init(int n){ par.resize(n + 1); size.assign(n + 1 , 1); for(int i = 0;i<=n;i++)par[i] =i; } int find(int u){ if(par[u] == u) return u; return par[u] = find(par[u]); } void Union(int u , int v){ int paru = find(u); int parv = find(v); if(paru == parv){ return; } if(size[paru] < size[parv]){ par[paru] = parv; size[parv] += size[paru]; } else{ par[parv] = paru; size[paru] += size[parv]; } } }; signed main() { ios::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; DSU dsu; dsu.init(n); // Use map for sparse relations (keys are sorted pairs of roots) map<pii, int> relations; // or unordered_map with hash for pii while (q--) { char t; cin >> t; int u, v; cin >> u >> v; int pu = dsu.find(u), pv = dsu.find(v); if (t == 'Q') { if (pu == pv) { cout << "R\n"; } else { pii key = {min(pu, pv), max(pu, pv)}; cout << (relations[key] ? "A\n" : "?\n"); } } else if (t == 'A') { if (pu != pv) { // Ignore if same pii key = {min(pu, pv), max(pu, pv)}; relations[key] = 1; } } else { // 'C' - union if (pu != pv) { // TODO: Merge relations from pu and pv into new root // E.g., iterate over current neighbors of pu/pv and add to new root dsu.Union(u, v); } } } }
#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...