제출 #1302711

#제출 시각아이디문제언어결과실행 시간메모리
1302711samarthkulkarniExperimental Charges (NOI19_charges)C++20
100 / 100
34 ms9868 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define vi vector<long long> #define all(x) x.begin(), x.end() #define endl "\n" void solution(); int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); solution(); return 0; } const int N = 1e5+10; ll rep[N], sz[N]; bool charge[N]; set<int> child[N]; int find(int a) { while (a != rep[a]) a = rep[a]; return a; } bool isSame(int a, int b) { return find(a) == find(b); } void unite(int a, int b) { a = find(a); b = find(b); if (a == b) return; if (sz[a] < sz[b]) swap(a, b); rep[b] = a; sz[a] += sz[b]; child[a].insert(b); } void flip(int a, set<int> &vis) { charge[a] ^= 1; vis.insert(a); for (int b : child[a]) { if (vis.count(b)) continue; flip(b, vis); } } void solution() { iota(rep, rep+N, 0); fill(sz, sz+N, 1); ll n, q; cin >> n >> q; while (q--) { char t; cin >> t; int a, b; cin >> a >> b; if (t == 'R') { if (charge[a] == charge[b]) { unite(a, b); } else { a = find(a); b = find(b); if (sz[a] < sz[b]) swap(a, b); set<int> vis; flip(b, vis); unite(a, b); } } else if (t == 'A') { if (charge[a] != charge[b]) unite(a, b); else { a = find(a); b = find(b); if (sz[a] < sz[b]) swap(a, b); set<int> vis; flip(b, vis); unite(a, b); } } else { if (!isSame(a, b)) { cout << "?" << endl; } else { cout << (charge[a] == charge[b] ? "R" : "A") << endl; } } } }
#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...