Submission #1223101

#TimeUsernameProblemLanguageResultExecution timeMemory
1223101overwatch9Experimental Charges (NOI19_charges)C++20
46 / 100
1098 ms318312 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 (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...