首先需要注意的是题目是持续的操作,即每个操作是在上一个操作的基础上进行的,由于序列无限循环,所以只需要维护左端点和右端点当前操作的位置。
考虑离线,对于取出长度大于n的,直接输出总的不同的整数个数即可,对于长度在n以内的,需要通过维护左端点和右端点先预处理好对应的序列区间,由于序列是无限循环的,所以可能出现从右边再到左边,这里可以将原始的序列扩充为原来的2倍长度,这样从右边到左边也可以看做是其中的连续部分。
将得到的序列区间进行排序,此时序列区间之间已经互不干扰了,因为在此前我们已经通过维护左右端点得到了持续取出的区间,只需要计算每个区间内不同整数的个数即可。这里可以使用树状数组在nlogn的时间下得到不同整数的个数,我们考虑维护每个整数最早出现的位置,由于序列区间排序了,所以区间的左端点是不断右移的,每次左端点移动的时候,就将其代表的整数的位置抹去,加入和它相同整数的下一个位置。此时对于每个区间只需要求出对应区间的位置内包含了最早出现的整数的位置的数量即可。
最后将离线排序后的区间对应的答案依次输出即可。时间复杂度为O(nlogn)。
小蓝有一个由 n 个整数组成的循环序列。该序列无限重复自身,即对于任意位置 i>n,该位置的值等于第 i−n 个位置的值。初始时,一个游标指向序列的第一个位置(值为 a1)。接下来有 q 次操作,每次操作提供一个指令 op('L' 或 'R')和一个正整数 x:
基础序列的长度 n 与操作次数 q 均满足 1≤n,q≤2imes105,序列中的每个整数范围在 [1,109] 之间。
第一行包含两个整数 n,q。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册