0

如果我们想更新一个范围内的值,谁能告诉我延迟传播在段树中是如何工作的?另外,我们如何使用分段树和惰性传播来解决这个问题?

假设一排有 15 个男孩,面向东站着,我们说经过 3 次移动后,从 [3,6] 开始的范围将朝北,经过 2 次移动后,他们将面向西方。如果我们的行大小在 10 6左右,我们将如何更新范围?

顺时针方向[东-->南-->西-->北-->东]

例如:假设最初有 n 个学生面向东站着,我们说我们必须将学生 3 到 6 顺时针方向移动两次。这样一来,搬家后,学生们就会像“eewweee e”一样。然后,我们想找到面向同一方向站立的范围内的最大学生数。在这个例子中,如果我们要在 [1,6] 范围内找到答案,那么有 2 个面向东的学生和 4 个面向西方的学生,所以答案是 4。

4

1 回答 1

0

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

对于您的问题:

假设我们有 N 个人。然后创建一个段树以添加 N 个初始值为 0 的叶子。如果您想将具有索引的人从 i 顺时针变为 j,则将 [i..j] 范围更新为 +1,如果逆时针 - 更新为 -1。

让我们对 North = 0、East = 1、South = 2 和 West = 3 进行编码。例如,如果人们最初在您的符号中表示为“nee s”,则在编码后它变为“0, 1, 1, 2”。

让我们将值(考虑范围更新!)从树的叶子到编码数组(n log n)中的对应值相加。假设我们逆时针转动人 [1..2],顺时针转动两次 [4]。然后在添加后数组为“-1, 0, 1, 4”。

现在将模运算应用于数组的每个数字:“3, 0, 1, 0”。解码后你得到最终的安排:“wne n”。现在找到最多的人面对相同的方向是微不足道的。

于 2014-06-27T06:37:00.800 回答