#55341: c++


yp11451267@yphs.tp.edu.tw (705-43鄭丞博)


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int MAXN = 200005;
int n, c_tot, q;
int col[MAXN];
vector<int> adj[MAXN];

int parent_node[MAXN], depth[MAXN], heavy[MAXN], head[MAXN], pos[MAXN], cur_pos;
int sz[MAXN];

struct ColorSet {
    unsigned long long bits[16];
    void flip(int bit) { bits[bit >> 6] ^= (1ULL << (bit & 63)); }
    void xor_with(const ColorSet& o) {
        for (int i = 0; i < 16; ++i) bits[i] ^= o.bits[i];
    }
    int count() const {
        int cnt = 0;
        for (int i = 0; i < 16; ++i) cnt += __builtin_popcountll(bits[i]);
        return cnt;
    }
};

// BIT 實作
ColorSet bit_tree[MAXN];

void bit_update(int idx, int color) {
    for (; idx <= n; idx += idx & -idx) {
        bit_tree[idx].flip(color);
    }
}

void bit_query(int idx, ColorSet& res) {
    for (; idx > 0; idx -= idx & -idx) {
        res.xor_with(bit_tree[idx]);
    }
}

void query_range(int l, int r, ColorSet& ans) {
    bit_query(r, ans);
    bit_query(l - 1, ans);
}

void dfs_sz(int u, int p, int d) {
    parent_node[u] = p; depth[u] = d; sz[u] = 1;
    int max_sz = 0;
    for (int v : adj[u]) {
        if (v != p) {
            dfs_sz(v, u, d + 1);
            sz[u] += sz[v];
            if (sz[v] > max_sz) { max_sz = sz[v]; heavy[u] = v; }
        }
    }
}

void dfs_hld(int u, int h) {
    head[u] = h; pos[u] = ++cur_pos;
    if (heavy[u]) dfs_hld(heavy[u], h);
    for (int v : adj[u]) {
        if (v != parent_node[u] && v != heavy[u]) dfs_hld(v, v);
    }
}

int query_path(int u, int v) {
    ColorSet ans;
    for (int i = 0; i < 16; ++i) ans.bits[i] = 0;
    while (head[u] != head[v]) {
        if (depth[head[u]] > depth[head[v]]) swap(u, v);
        query_range(pos[head[v]], pos[v], ans);
        v = parent_node[head[v]];
    }
    if (depth[u] > depth[v]) swap(u, v);
    query_range(pos[u], pos[v], ans);
    return ans.count();
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    if (!(cin >> n >> c_tot >> q)) return 0;

    for (int i = 0; i < n - 1; ++i) {
        int u, v; cin >> u >> v;
        adj[u].push_back(v); adj[v].push_back(u);
    }
    for (int i = 1; i <= n; ++i) cin >> col[i];

    dfs_sz(1, 0, 1);
    dfs_hld(1, 1);

    for (int i = 1; i <= n; ++i) {
        bit_update(pos[i], col[i]);
    }

    while (q--) {
        char type; cin >> type;
        if (type == 'U') {
            int x, c; cin >> x >> c;
            bit_update(pos[x], col[x]);
            col[x] = c;
            bit_update(pos[x], col[x]);
        } else {
            int u, v; cin >> u >> v;
            cout << query_path(u, v) << "\n";
        }
    }
    return 0;
}

#55344: Re: c++


chenwei980503@gmail.com (Zaim)


#include
#include
#include

using namespace std;

const int MAXN = 200005;
int n, c_tot, q;
int col[MAXN];
vector adj[MAXN];

int parent_node[MAXN], depth[MAXN], heavy[MAXN], head[MAXN], pos[MAXN], cur_pos;
int sz[MAXN];

struct ColorSet {
    unsigned long long bits[16];
    void flip(int bit) { bits[bit >> 6] ^= (1ULL << (bit & 63)); }
    void xor_with(const ColorSet& o) {
        for (int i = 0; i < 16; ++i) bits[i] ^= o.bits[i];
    }
    int count() const {
        int cnt = 0;
        for (int i = 0; i < 16; ++i) cnt += __builtin_popcountll(bits[i]);
        return cnt;
    }
};

// BIT 實作
ColorSet bit_tree[MAXN];

void bit_update(int idx, int color) {
    for (; idx <= n; idx += idx & -idx) {
        bit_tree[idx].flip(color);
    }
}

void bit_query(int idx, ColorSet& res) {
    for (; idx > 0; idx -= idx & -idx) {
        res.xor_with(bit_tree[idx]);
    }
}

void query_range(int l, int r, ColorSet& ans) {
    bit_query(r, ans);
    bit_query(l - 1, ans);
}

void dfs_sz(int u, int p, int d) {
    parent_node[u] = p; depth[u] = d; sz[u] = 1;
    int max_sz = 0;
    for (int v : adj[u]) {
        if (v != p) {
            dfs_sz(v, u, d + 1);
            sz[u] += sz[v];
            if (sz[v] > max_sz) { max_sz = sz[v]; heavy[u] = v; }
        }
    }
}

void dfs_hld(int u, int h) {
    head[u] = h; pos[u] = ++cur_pos;
    if (heavy[u]) dfs_hld(heavy[u], h);
    for (int v : adj[u]) {
        if (v != parent_node[u] && v != heavy[u]) dfs_hld(v, v);
    }
}

int query_path(int u, int v) {
    ColorSet ans;
    for (int i = 0; i < 16; ++i) ans.bits[i] = 0;
    while (head[u] != head[v]) {
        if (depth[head[u]] > depth[head[v]]) swap(u, v);
        query_range(pos[head[v]], pos[v], ans);
        v = parent_node[head[v]];
    }
    if (depth[u] > depth[v]) swap(u, v);
    query_range(pos[u], pos[v], ans);
    return ans.count();
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    if (!(cin >> n >> c_tot >> q)) return 0;

    for (int i = 0; i < n - 1; ++i) {
        int u, v; cin >> u >> v;
        adj[u].push_back(v); adj[v].push_back(u);
    }
    for (int i = 1; i <= n; ++i) cin >> col[i];

    dfs_sz(1, 0, 1);
    dfs_hld(1, 1);

    for (int i = 1; i <= n; ++i) {
        bit_update(pos[i], col[i]);
    }

    while (q--) {
        char type; cin >> type;
        if (type == 'U') {
            int x, c; cin >> x >> c;
            bit_update(pos[x], col[x]);
            col[x] = c;
            bit_update(pos[x], col[x]);
        } else {
            int u, v; cin >> u >> v;
            cout << query_path(u, v) << "\n";
        }
    }
    return 0;
}

請不要使用AI, 感謝 !  假設是你自己寫的, 歡迎來 atcoder 或 codeforce 炸魚, 或者來破台下次算法賽  orz