我想使用分段树解决Joseph Flavius问题。我几乎可以肯定,简单的模拟(即排行列表)是O(n^2)
。我想要实现的是从段树中获取特定距离的数组。换句话说,段树将保留有关已删除元素数量的信息,并从树中获取一些信息将允许在O(1)中找到要删除的下一个元素。问题是我不知道如何在段树中存储信息以使其适用于Joseph Flavius问题。
每个节点都有一些额外的值吗?但是如何查询下一个元素呢?
答案 0 :(得分:0)
我首先想到的是二进制搜索+求和的Sement树,得出O(log ^ 2(n))
从L跳到R具有以下属性:
R-L +1-sum(L,R)== skip_value
您可以使用bin-search轻松找到具有此属性的R。 当您围成一个完整的圈时,它会变得有些复杂,但我相信您会明白。
如果有任何不清楚的地方,随时问。
(我也会考虑log(n)解决方案)