POJ 2886: Who Gets the Most Candies?
POJ 2886: Who Gets the Most Candies?
题意
约瑟夫环问题(Josephus Problem)(固定下一个踢出位置),这道题下一个踢出位置由当前踢出人决定。
N 个人围成一圈,编号从 1∼N,每个当前踢出的人能决定下一个踢出的人在相对于他的第几个位置,开始时踢出人在位置 K 上。
设小于等于 N 的最大的反素数为 q,求出第 q 次踢出的人的位置。
数据范围:1⩽N⩽5×105,1⩽K⩽N。
思路
先求出小于等于 N 的最大的反素数,求法见 反素数。
用线段树维护当前还剩余的人,有一个人就记为1(即计数线段树)。
通过线段树,能log级求出来当前从左到右第rk位的人的id。
那么下一步就是如何快速求出下一个踢出的人相对于第一个人是第几个:
这个问题最初是Josephus Problem是可以用递推线性求解的,这个问题可以类似思考,
考虑当前剩余人数和顺时针枚举还是逆时针枚举顺序这些条件,就可以确定下来下一次踢出的人的相对rk值。
点击显/隐代码