本文共 1323 字,大约阅读时间需要 4 分钟。
为了高效处理箱子合并和查询操作,我们采用并查集(Union-Find)结构。这个结构利用路径压缩和按秩合并,能够在合理时间内处理大量操作。
初始化:
操作处理:
并查集优化:
#include#define MAXN 30001using namespace std;int pre[MAXN], son[MAXN], vis[MAXN];int find(int x) { if (pre[x] == x) { return x; } int temp = pre[x]; pre[x] = find(pre[x]); vis[x] += vis[temp]; return pre[x];}void jion(int x, int y) { int px = find(x); int py = find(y); if (px != py) { pre[py] = px; vis[py] = son[px]; son[px] += son[py]; }}int main() { int p; scanf("%d", &p); for (int i = 1; i <= MAXN; ++i) { pre[i] = i; son[i] = 1; } for (int i = 1; i <= p; ++i) { char s[2]; int x, y; scanf("%s", s); if (s[0] == 'M') { scanf("%d%d", &x, &y); jion(x, y); } else { scanf("%d", &x); int root = find(x); printf("%d\n", son[root] - vis[x] - 1); } } return 0;}
find函数通过递归更新每个节点的父节点和路径长度,确保后续查找更快。pre记录父节点,son记录子树大小,vis记录路径长度,有效维护并查集状态。这个方法高效处理了大规模数据,避免了直接模拟的复杂度,适合处理类似的问题。
转载地址:http://cdxfk.baihongyu.com/