这道题又是并查集
并查集可以解决这一类问题:
问题的开始 所有元素之间是没有关系的
随着问题的进行 元素之间不断地集合在一起,变成新的集合
这种问题很方便地可以用并查集来描述。
这个问题也是这样。
不过,由于问题的性质,这里的并查集结点中存储一个表示节点在集合内关系的值是不够的,需要两个,CubeBelow和CubeInStack。
另外,这道题很好地体现了并和查这两个操作各自所承担的更新节点信息的任务。
两个原本没有关系的集合,在并之后,被并入的集合中各个节点的关系是需要更新的。
并查集有一个特点是只能由底向上查找,而不能由顶向下,因为数据结构采用的是树的根节点表示法。
所以并查集可以大胆地在并操作中只更新与新的根节点直接相连的节点信息,而不用理会其余新加入的结点,因为不能由上而下的找到他们,所以他们的数据即使是错误的也是安全的。而把这个工作放到查操作里,因为查操作有递归的性质,在递归返回的过程中会从上而下的依次路过需要更新信息的结点,这时候做这些工作就很方便了。
也就是说并和查分别承担了一部分并之后需要做的更新节点信息的任务。而并又需要查来做准备,所以能保证每次并之前节点信息的正确性。
能对于一般并查集问题的求解,也是基于查操作的,这保证了求解的正确。
但是这道题,由于我设计的并查集结构,进行COUNT求解时不需要查操作就可以(不知有没有别的设计方法来避免这个问题),所以要想问题正确,必须在求解前强制地查一次,或者每次并之后都查(没验证过,而且效率也不如前者)。
代码如下: