我有一个问题,其中一个男孩有n张卡片(2张脸,一张黑色,白色< => 0/1)。最初这些卡都是白脸。 我需要能够在n行卡上进行两次操作。
我需要找到的是一种在O(n)下保持这两个操作之和的方法。 有什么好的数据结构可以解决这个问题吗?
答案 0 :(得分:2)
您可以创建一个平衡树,其中卡片是叶子,并且每个节点都有翻转指示器。
要翻转卡片,请翻转距离根部最近的节点。这是O(log n)。
要获取卡的状态,请将根目录转到相应的叶子,然后从路径中的所有节点转换翻转指示符。这也是O(log n)。
例如,如果您有这样的树:
A
/ \
/ \
B C
/ \ / \
1 2 3 4
想要翻转间隔[1,3],你会翻转节点B和3.要获得状态2,你可以在A,B和2中找出值,并找出该节点被翻转。 / p>