Arrays 线段树上的Josephus Flavius

Arrays 线段树上的Josephus Flavius,arrays,algorithm,data-structures,segment-tree,josephus,Arrays,Algorithm,Data Structures,Segment Tree,Josephus,我想用分段树解决Joseph Flavius问题。我几乎可以肯定,简单模拟(即线性列表)是O(n^2)。我想要实现的是从片段树中跳到特定距离的数组上。换句话说,段树将保留有关已删除元素数量的信息,从树中获取一些信息将允许在O(1)中查找要删除的下一个元素。问题是,我不知道如何在段树中存储信息,以使其适用于Joseph Flavius问题 在每个节点中保留某种额外的值?但是如何查询下一个元素呢 我的第一个想法是二进制搜索+给出O(log^2(n))和的精液树 从L跳到R具有以下属性: R-L+1-

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


在每个节点中保留某种额外的值?但是如何查询下一个元素呢

我的第一个想法是二进制搜索+给出O(log^2(n))和的精液树

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

R-L+1-和(L,R)=跳过_值

您可以使用bin搜索轻松找到具有此属性的R。 当你画一个完整的圆圈时,事情会变得复杂一些,但我相信你已经明白了

如果有什么不清楚的地方,请随时询问


(我还将考虑日志(n)解决方案)

您是否已经编写了任何代码?唯一的解决方案是基于链表的,这太复杂了。解决此问题的最简单解决方案根本不使用数据结构。它从结束位置开始(当只剩下一个人时),循环计算先前执行的人的位置。第二个最简单的解决方案从n个人开始,使用递归。当n较大时,这会使用太多的堆栈,但您可以始终实现自己的堆栈,并作为循环执行递归。