用到了并查集的一道题目
用 dis 数组来记录一个点到堆顶的距离,sz 数组来记录一个堆有多少个点,那么某个点下方的点数为 sz[fx]-dis[x]
这样看起来还是要做很多步,比如每次合并的时候下面的堆所有的点的 dis 都要更新,复杂度可能会到O(n*n),其实利用并查集的特性,我们可以只在询问到这个点的时候更新,这样就可以大大减少更新所花的时间了。为了后续查询的时候能正确更新,每次合并只需将下方堆顶到上方堆顶的距离更新即可。
// Cube Stacking
#include <iostream>
const int N = 3e4 + 5;
using namespace std;
int f[N], sz[N], dis[N];
int Find(int x)
{
int fx = f[x