[ABC258E] Packing Potatoes Solution

更好的阅读体验戳此进入

题面

给定序列 W,下标范围为 [0,n1]。存在一个长度为 10100 的土豆序列,循环节为 n,第 i 个土豆的重量为 W(i1)modn。现在你需要用箱子装土豆,每个箱子装满则停止,即土豆重量恰好大于等于 X 时则停止。Q 组询问求第 ki 个箱子装了多少个土豆。

Solution

一道细节不少的找规律题。

首先不难发现,对于这个箱子,当你确定了从哪里开始装后,其最远能装到的位置也就确定了。我们考虑如何确定这个东西,不难想到做个前缀和然后二分,找到对应点开始的最长能取的长度,细节较多,如需要注意若长度仅为一初值需要判断。因为可能转回去所以可以将序列复制一份然后在这上面跑即可。

此时仍需要注意 X 可能很大以至于横跨多段,此处需要记录。此时我们即有 nxt 数组表示从该点开始取完土豆之后下一次需要从哪开始取。不难发现每个点有且仅有一条出边,则一定会成环,我们找到从 1 开始多少步后进入环,以及环长和每个位置的元素,最后对于每个询问判断一下是否进入环,未进入则直接调用,进入了则模一下找对应位置。中间细节很多,这道题本身的难度也就在细节上了,具体可以看代码。

复杂度卡在预处理上,最终复杂度 O(nlogn)

Code

UPD

update-2022_12_13 初稿