BZOJ 1878 HH的项链

题意

给出一个数列,问你好多次在这个序列上某一段里面有多少不同的数。数列没有发生更新。

思路

因为没有发生更新,所以可以采用这样的一种方法:

首先接收好全部的查询请求,然后把查询请求按照右端点从小到大排列。接下来,我们已Sample为例“1 2 3 4 3 5”,首先看1,这个数没有出现过,我们给一号位置标记一个1,然后看2,没出现过,标记一个1,然后3号位的3没出现过,标上1,然后四号位标1,然后到了五号位,我们发现3出现过了,所以要把之前出现过的三号位的1抹去,给5号位标上1,到了六号位,是5,没出现过,标记上1。

我们发现,在上面这个过程中,只要我们照着这种方法来标记,就可以确保检查到i号位的时候,所有1~i这个区间的询问都是准确的,也就是说我们一次处理一位的标记情况,之后就可以处理掉所有以这一位为右端点的询问,询问的结果就是被询问的那一段区间的标记之和。区间和当然要优化,可以使用BIT。

代码

 

Scroll to top