加载中...

3.21——919 D

919 D

限时每日一题day18。看了十几分钟毫无思路,遂来补题。

需要记录两个状态:

  1. \(lst[i]\):第 \(i\) 步操作后,序列中的最后一个元素
  2. \(dp[i]\):第 \(i\) 步操作后的序列长度

对于每次询问查询第 \(k\) 个元素,可分为两种情况:

  1. \(k\) 个元素是在某次操作 \(1\) 新添加的元素:设那一步操作 \(1\) 是第 \(i\) 步操作,则 \(lst[i]\) 即为所求。
  2. \(k\) 个元素是在某次操作 \(2\) 被复制的元素:设那一步操作 \(2\) 是第 \(i\) 步操作,则前 \(dp[i]\) 个元素是以长度为 \(dp[i-1]\)的序列构成的循环节。则第 \(k\) 个元素与第 \(k\space mod\space dp[i - 1]\) 个元素是相同的。可以继续递归查询第 \(k\space mod\space dp[i - 1]\) 个元素。由于每次复制长度至少增加一半,因此递归深度不会超过 \(logn\),总复杂度 \(O(qlogn)\)

由于 \(dp\) 数组是单调递增的,因此可以二分来找对应的第 \(i\) 步操作。

code

posted @ 2025-03-21 09:23  jxs123  阅读(9)  评论(0)    收藏  举报