【问题标题】:segment tree with lazy propagation in large range在大范围内具有延迟传播的分段树
【发布时间】:2014-06-27 04:42:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 很不清楚你在这里问什么。提供一些代码。
  • 假设有 n 个学生最初站在东边,我们说我们必须将学生从 3 移动到 6,顺时针方向移动 2 次,那么学生将像“e e w w w w e e e e”,我们必须找到在同一方向的范围内找出最大学生,就像我们必须在范围 [1,6] 内找到 ans,然后在东方向有 2 个学生,在西有 4 个学生,所以答案是 4 。现在清楚了吗? .顺时针方向[东-->南-->西-->北-->东]
  • 通过编辑将其添加到问题中。

标签: algorithm segment-tree


【解决方案1】:

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 进行编码。例如,如果人们最初在您的符号中表示为“n e e s”,则在编码后它会变为“0, 1, 1, 2”。

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

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

【讨论】:

  • 感谢您的回复。我应用相同的逻辑,但更新我需要(log n)时间,所以我需要惰性传播方法,你知道如何解决这个问题或它是如何工作的? , 因为会有 m 个查询 (1
  • @user2444870 我提供的第一个链接对此做了很好的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
相关资源
最近更新 更多