反转数组查询

时间:2015-10-06 09:22:06

标签: algorithm data-structures tree

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

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)这将是相当慢的,如何使它更快可以使用段树?

1 个答案:

答案 0 :(得分:3)

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

这可以使用装饰的展开树在时间O((n + q)log n)中完成。每个节点装饰由一个后代计数和一个位组成,当设置时,它会隐式翻转整个子树。要进行查询,请使用后代计数导航到正确的节点。要从u转换为v,请将u展开到根,将其左子树u.L分离,将v展开到根,分离其右子树{ {1}},将所有v.Ru.Lv上的翻转位反转,重新挂接v.Ru.L来自的字段,splay { {1}},同样重新加入v.R

u