我有一个大小为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)这将是相当慢的,如何使它更快可以使用段树?
答案 0 :(得分:3)
我不确定分段树算法是什么样的。
这可以使用装饰的展开树在时间O((n + q)log n)中完成。每个节点装饰由一个后代计数和一个位组成,当设置时,它会隐式翻转整个子树。要进行查询,请使用后代计数导航到正确的节点。要从u
转换为v
,请将u
展开到根,将其左子树u.L
分离,将v
展开到根,分离其右子树{ {1}},将所有v.R
,u.L
,v
上的翻转位反转,重新挂接v.R
到u.L
来自的字段,splay { {1}},同样重新加入v.R
。
u