具有大范围惰性传播的分段树

时间:2014-06-27 04:42:52

标签: algorithm segment-tree

如果我们想要更新某个范围内的值,有人可以告诉我在段树中延迟传播是如何工作的吗?另外,我们如何使用分段树和延迟传播来解决这个问题呢?

假设连续15个男孩站在朝东,我们说在3次移动后,[3,6]的范围将面向北方,经过2次移动后,他们将面向西方。如果我们的行大小约为10 6

,我们如何更新范围?

顺时针方向[EAST - > SOUTH - > WEST - > NORTH - > EAST]

例如:假设有n名学生最初站在朝东,我们说我们必须按顺时针方向移动学生3到6两个动作。因此,移动后,学生将会像“e e w w w e e e”。然后,我们希望找到面向同一方向的范围内的最大学生人数。在这个例子中,如果我们在范围[1,6]中找到答案,那么有2名学生面向东方,4名面向西方,所以答案是4。

1 个答案:

答案 0 :(得分:0)

http://wcipeg.com/wiki/Segment_tree#Lazy_propagation

解决您的问题:

假设我们有N个人。然后创建一个段树,用于添加N个叶子,最初值为0。如果你想顺时针转换索引从i到j的人,你可以用+1来更新[i..j]范围,如果是逆时针的话 - 用-1更新。

让我们编码North = 0,East = 1,South = 2和West = 3.例如,如果人们最初表现为" n e s"在你的符号中它变成" 0,1,1,2和#34;编码后。

让我们将值从树的叶子到编码数组(n log n)中的值相加(考虑范围更新!)。假装我们逆时针转动人[1..2],顺时针转动两次[4]。然后在添加之后,阵列是" -1,0,1,4和#34;。

现在将模运算应用于数组的每个数字:" 3,0,1,0和#34;。解码后,您将获得最终安排:" w n e"。找到面对同一方向的大多数人现在都是微不足道的。