algorithm - 反转数组查询

标签 algorithm data-structures tree

我有一个大小为 N 的数组,我给出了 2 种类型的查询

1 L R 反转 [L,R] 中的所有元素
2 L 求索引L处的值。

Example: [1,2,3,4,5]
1 2 4   -> [1,4,3,2,5]
1 4 5   -> [1,4,3,5,2]
2 5    -> 2

Q-查询次数
Q<=10^5 和 N<=10^5
直接解决方案将是 O(Q*N) 这将非常慢,如何使它更快可以使用线段树?

最佳答案

我不确定线段树算法是什么样的。

这可以在 O((n + q) log n) 时间内使用装饰的拉伸(stretch)树完成。每个节点装饰都包含一个后代计数和一个位,设置后会隐式翻转整个子树。要查询,请使用后代计数导航到正确的节点。要从 u 反转到 v,展开 u 到根,分离它的左子树 u.L,展开 v 到根,分离它的右子树 v.R,反转所有 u.Lvv.R,将u.L重新附加到v.R来自的字段,展开u,重新附加v.R同样。

Key: ? denotes an anonymous node
     ^ denotes a subtree


   u
  / \
u.L  ?
 ^  / \
   v   ?
   ^   ^


u.L    v
 ^    / \
     u  v.R
      \  ^
       ?
       ^


v.R    v     # v's flip bit is inverted
 ^    / \
     u  u.L  # so is u.L's, for no effect on u.L
      \  ^
       ?
       ^


   u
  / \
v.R  v
 ^  / \
   ?  u.L
   ^   ^

关于algorithm - 反转数组查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32966228/

相关文章:

parsing - 创建能够在 Prolog 中解析树的 DCG

algorithm - SML : Replacing a concat by printing the string directly

c++ - 为迷宫实现一棵树以在 DFS、BFS 中使用

algorithm - 递归创建给定深度的完整二叉树

Java 作业 MaxSumTest

data-structures - 实现不可变的、可增长的向量

string - 包含集合中出现次数最多的字符串的最短字符串

java - 以智能方式减少文本长度以适合单元格宽度

algorithm - 节水小便器的最优算法设计是什么?

python - 这是快速排序还是合并排序?