3.21——919 D
919 D
限时每日一题day18。看了十几分钟毫无思路,遂来补题。
需要记录两个状态:
- \(lst[i]\):第 \(i\) 步操作后,序列中的最后一个元素
- \(dp[i]\):第 \(i\) 步操作后的序列长度
对于每次询问查询第 \(k\) 个元素,可分为两种情况:
- 第 \(k\) 个元素是在某次操作 \(1\) 新添加的元素:设那一步操作 \(1\) 是第 \(i\) 步操作,则 \(lst[i]\) 即为所求。
- 第 \(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\) 步操作。

浙公网安备 33010602011771号