提问人:cracra 提问时间:1/24/2021 最后编辑:cracra 更新时间:1/25/2021 访问量:210
查找交换序列后每个节点占用的唯一位置数
Finding the number of unique positions occupied by every node after sequence of swaps
问:
一条线上有 N (N <= 50000) 个节点,节点 i 位于该线上的位置 i。你得到一个 M 个不同的掉期序列 (M <= 20000),它写在 from (a1, b1) (a2, b2) ....(aM、bM)。在每个单位时间内,i = 1...M,位置 ai 和 bi swap 的节点。然后,相同的 M 交换在 M + 1....2M 分钟内再次发生,然后是 2M + 1...3M,依此类推,继续以 K 个时间单位 (K < 10^18) 的循环方式。
举个例子,
在时间单位 1 处,位置 a1 和 b1 的节点交换。
在以时间为单位 2 时,位置 a2 和 b2 的节点交换。
...
在以时间为单位 M 时,位置 aM 和 bM 的节点交换。
在以 M + 1 为单位的时间,位置 a1 和 b1 的节点交换。
在以 M + 2 为单位的时间,位置 a2 和 b2 的节点交换。
等等......
对于每个节点,系统会要求您确定它将占据的唯一位置的数量。
例:
6 个节点,M = 4(序列由 4 个交换组成),K = 7(总时间单位为 7)。
序列:
(1, 2)(2, 3)(3, 4)(4, 5)
模拟:
时间 0:{1、2、3、4、5、6}
时间 1:{2、1、3、4、5、6}
时间 2:{2, 3, 1, 4, 5, 6}
时间 3:{2、3、4、1、5、6}
时间 4:{2, 3, 4, 5, 1, 6}
时间 5:{3, 2, 4, 5, 1, 6}
时间 6:{3、4、2、5、1、6}
时间 7:{3、4、5、2、1、6}
答:
节点 1 到达位置 {1, 2, 3, 4, 5},即 5 个位置。
节点 2 到达位置 {1, 2, 3, 4},即 4 个位置。
节点 3 到达位置 {1, 2, 3},因此为 3 个位置。
节点 4 到达位置 {2, 3, 4},因此为 3 个位置。
节点 5 到达位置 {3, 4, 5},因此有 3 个位置。
节点 6 不移动,因此它到达位置 {6},因此到达 1 个位置。
解决此问题的一种方法是将节点视为图形。然后,您可以将每个交换视为连接,然后使用图形算法来计算节点之间的移动方式。
如何成功地将图算法合并到这个问题中?
编辑:我又花了几个小时思考这个问题,并希望将Ehsan的想法纳入解决方案中。要找到每个位置的可能节点,您可以使用递归函数,就像 Ehsan 提出的函数一样 (F(F(...(F(original_order)))。然后,您可以对 K 中的每一步执行此操作。但是,这将是一个 NK 解决方案,我太慢了,因为我可以执行的最大操作数是 10^9。我怎样才能优化我当前的想法?
答:
你不需要图表。 他们的关键点是减少k
引理:假设在一系列步骤之后,从原始节点列表到新的节点顺序,例如,并且每个节点都有一个唯一的访问列表,作为{n1,n2,n3,...,nN}
{s1,s2,.....,st}
{n_i1,...,n_iN}
{n1_v1,...,n1_vn1},...,{nN_v1,...,nN_vnN}
然后,如果您再次执行相同的系列步骤,则可以在上一步的帮助下找到新的节点顺序列表以及唯一访问列表。
所以这是一种动态编程。
通过这种方法,算法的复杂性可能为O(n)
O(n*log(k/m)+m)
评论
{s1,...,st}
{n1,...,nN}
O(n)
{1,2,3}
{3,1,2}
{2,3,1}
F
F(F(...(F(original_order)))
评论