段树上的约瑟夫斯弗拉维乌斯

时间:2015-12-12 09:28:29

标签: arrays algorithm data-structures segment-tree josephus

我想使用分段树解决Joseph Flavius问题。我几乎可以肯定,简单的模拟(即排行列表)是O(n^2)。我想要实现的是从段树中获取特定距离的数组。换句话说,段树将保留有关已删除元素数量的信息,并从树中获取一些信息将允许在O(1)中找到要删除的下一个元素。问题是我不知道如何在段树中存储信息以使其适用于Joseph Flavius问题。

每个节点都有一些额外的值吗?但是如何查询下一个元素呢?

1 个答案:

答案 0 :(得分:0)

我首先想到的是二进制搜索+求和的Sement树,得出O(log ^ 2(n))

从L跳到R具有以下属性:

R-L +1-sum(L,R)== skip_value

您可以使用bin-search轻松找到具有此属性的R。 当您围成一个完整的圈时,它会变得有些复杂,但我相信您会明白。

如果有任何不清楚的地方,随时问。

(我也会考虑log(n)解决方案)