arrays - 在交换序列后查找每个节点占用的唯一位置的数量
问题描述
一条线上有 N (N <= 50000) 个节点,节点 i 位于线上的位置 i 上。给你一个 M 个不同交换的序列 (M <= 20000),写在 from (a1, b1) (a2, b2) ... 中。(aM, bM)。在每个时间单位 i = 1…M 中,位置 ai 和 bi 处的节点交换。然后,相同的 M 交换在 M + 1….2M 分钟内再次发生,然后是 2M + 1…3M,依此类推,继续循环方式持续 K 个时间单位 (K < 10^18)。
例如,
在单位时间 1,位置 a1 和 b1 的节点交换。
在单位时间 2,位置 a2 和 b2 的节点交换。
…</p>
在单位时间 M 处,位于 aM 和 bM 位置的节点交换。
在时间单位 M + 1 处,位置 a1 和 b1 的节点交换。
在时间单位 M + 2 处,位置 a2 和 b2 的节点交换。
等等……</p>
对于每个节点,您被要求确定它将占据的唯一位置的数量。
例子:
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)
推荐阅读
- python - 如何移动二次线?
- reactjs - 如何将 HOC 组件导航到 App 组件
- c# - 在 azure 上部署后 SignalR 无法正常工作。在 localhost 上工作
- reporting-services - SSAS/SSRS:没有百分比格式?
- python - 我如何知道 XGBoost 的正类值和负类值是哪个?
- python - 查询数据帧时的分配律
- sql - 前 12 个月间隔和 ISO 周的平均值
- c++ - 一个类只有公共(没有私有或受保护)方法和变量是一种好习惯吗?
- javascript - Chrome 调试器 - 避免进入 Node.js 内部?
- google-cloud-functions - 在欧盟使用 Firebase 托管/功能提供动态内容