对于间隔上的翻转和状态查询,什么是良好的数据结构

时间:2011-11-24 14:17:03

标签: c data-structures

我有一个问题,其中一个男孩有n张卡片(2张脸,一张黑色,白色< => 0/1)。最初这些卡都是白脸。 我需要能够在n行卡上进行两次操作。

  • flip(i,j)在行i和j索引之间翻转卡片
  • 州(i)在i索引位置返回卡的颜色

我需要找到的是一种在O(n)下保持这两个操作之和的方法。 有什么好的数据结构可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您可以创建一个平衡树,其中卡片是叶子,并且每个节点都有翻转指示器。

要翻转卡片,请翻转距离根部最近的节点。这是O(log n)。

要获取卡的状态,请将根目录转到相应的叶子,然后从路径中的所有节点转换翻转指示符。这也是O(log n)。

例如,如果您有这样的树:

     A
    / \
   /   \
  B     C
 / \   / \
1   2 3   4

想要翻转间隔[1,3],你会翻转节点B和3.要获得状态2,你可以在A,B和2中找出值,并找出该节点被翻转。 / p>