Algorithm 如何解决带更新的脱机范围mex查询?

Algorithm 如何解决带更新的脱机范围mex查询?,algorithm,data-structures,segment-tree,Algorithm,Data Structures,Segment Tree,注意我在stack和其他一些网站上读过所有相同的问题。 所有这些都是错误的或比TL更有效 现在关于任务: 输入数组的大小:N 将阵列分成大小为n2/3的块。这将给我们留下n1/3块 对于每对x y块,xO(n5/3*logN) 对于更新,我们将更新位置在范围内的所有块对。更新包括从当前值的计数中减去1,如果计数为0,则将值添加到集合中,然后将1添加到新值的计数中,并从集合中删除该值。这是每对块的O(logn),这为每个更新提供了O(n2/3*logn)成本 对于查询,查找完全封闭在查询边界内的最

注意我在stack和其他一些网站上读过所有相同的问题。 所有这些都是错误的或比TL更有效

现在关于任务:

输入数组的大小:
N
  • 将阵列分成大小为n2/3的块。这将给我们留下n1/3块
  • 对于每对x y块,xO(n5/3*logN)
  • 对于更新,我们将更新位置在范围内的所有块对。更新包括从当前值的计数中减去1,如果计数为0,则将值添加到集合中,然后将1添加到新值的计数中,并从集合中删除该值。这是每对块的O(logn),这为每个更新提供了O(n2/3*logn)成本
  • 对于查询,查找完全封闭在查询边界内的最大块对。然后查看那些边界中从右到左丢失的数组值,并对它们进行排序。使用此+缺失值集,我们可以计算该范围的mex。注意,我们必须向左和向右检查最多2n2/3个值,因此排序将花费O(2n2/3*日志2n2/3)。这是每个查询的成本
总之,复杂性是O(n5/3*logn+u*n2/3*logn+q*2n2/3*log2n2/3),q是范围查询量,u是更新量

一些优化:

  • 对于更新,您可以使用延迟更新,只需让范围知道我们需要进行更新,但仅在查询需要时对一对块进行更新

在我看来,被接受的答案是一个很好的解决方案。你能告诉我它出了什么问题吗?如果你离线进行,你应该能够通过按开始索引对查询进行排序来简化事情。您可以构建一个状态机,并在输入数组的单个连续过程中回答所有查询。但不确定构建状态机的复杂性。@JimMischel不清楚我们在段树的节点中存储了什么。这是一个最后位置的RMinQ+数组吗?@juvian“简单段树和在一个范围内”如何帮助计算mex?不幸的是,这是在TL上(@user10101134是在查询前预处理所有对,给出TL还是在查询后预处理?仅仅因为O(N^(5/3)logN)