POJ 1988 Cube Stacking(并查集,路径压缩)

Description:

初始时有n个方块,每个都是一堆,然后之后给出Q个操作,共有两种操作:

1. M u v 将方块u所在堆,堆放到方块v所在堆上

2.C u 查询在方块u的下方有多少个方块

Input:

Q, 然后是Q个操作

Output:

对于每个操作2,输出答案

Analysis:

直接模拟肯定超时,这一题也很明显是数据结构题,关键性的操作还是堆的合并和查询,和并查集很像,可以考虑用并查集。设under[u]为在方块u下方的方块数,这样的话有两个问题要考虑,1. 是方块在上方的作为并查集的根还是方块在下方的作为根 2.如何维护under, 怎样查询与合并。

其实先考虑好了第二个问题第一个问题也就自然了,首先肯定是要用路径压缩的方式进行信息合并,路径压缩就是在向上查询根节点时,顺便计算出了上面所有节点的相应信息,然后再用上面的信息更新当前节点的信息,这样我们知道更新under[u]需要用u下方的节点来更新它,由此我们可以确定将在下方的节点作为根节点,然后路径压缩计算under也就自然可以写出来了。

还有一个问题是,操作1如何做,也就是要怎样合并节点,如果将u节点所在堆放在v所在堆上的话,under[u]实际上应该更新为under[u]+under[v所在堆的最上层节点], 但是在并查集上我们只能查询根节点,而我们实际上使用最底层的节点做为根节点的,那要怎么做呢?由于只能查询根节点受到了局限,我们可以换个角度而不去纠结于并查集的节点,站在整个堆的角度考虑,可以新加一个sum数组,sum[u]表示u所在堆的方块数,这样的话就可以直接写出更新方式under[pu]=sum[pv],sum[pv]+=sum[pu].

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<sstream>
#include<cmath>
#include<iterator>
#include<bitset>
#include<stdio.h>
#include<time.h>
using namespace std;
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
typedef long long LL;
const int INF = 0xffffff0;
const int MOD = 1000000007;
const int maxn = 30005;

int n;
int pa[maxn];
LL sum[maxn], under[maxn];
int find(int x) {
	if (pa[x] == x)return x;
	int tmp = find(pa[x]);
	under[x] += under[pa[x]];
	pa[x] = tmp;
	return tmp;
}
void merge(int u, int v) { //u所在堆放到v所在堆上
	int pu = find(u), pv = find(v);
	if (pu == pv)return;
	pa[pu] = pv;
	under[pu] = sum[pv];
	sum[pv] += sum[pu];
}

int main() {
	//freopen("C:\\Users\\admin\\Desktop\\in.txt", "r", stdin);
	//freopen("C:\\Users\\admin\\Desktop\\out.txt", "w", stdout);
	int q; scanf("%d", &q);
	for (int i = 0; i < maxn; ++i)pa[i] = i,sum[i]=1,under[i]=0;
	char cmd[2];
	while (q--) {
		scanf("%s", cmd);
		int u, v;
		if (cmd[0] == 'M') {
			scanf("%d%d", &u, &v);
			merge(u, v);
		}
		else {
			scanf("%d", &u);
			find(u);
			printf("%lld\n", under[u]);
		}
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/tomandjake_/article/details/81608207