Description
给你一个长度为$n$($1\leq n\leq 50000$)的序列$a_i$($1\leq 1000000\leq a_i$),有$m$($1\leq m\leq 200000$)个询问,每次询问一段区间内有多少个不同的数字。
Input
第一行,一个整数$n$。
第二行,$n$个整数,第$i$个数为$a_i$。
第三行,一个整数$m$。
接下来$m$行,每行两个整数$l$和$r$,表示询问的区间。
Output
$m$行,每行一个整数,依次表示询问的答案。
solution
区间查询直接上莫队。
莫队给排完序后就直接暴力做啦,用一个数组保存当前区间每个数的个数……(做法太简单省略了)。
或者这题还可以用主席树做(这想法贼6)。
不难发现,每个数只有在当前询问区间$[l,r]$内第一次出现才会对答案有贡献,在当前询问区间[l,r]内第二次出现显然没用,那我们用一个数组$last$记录一下第$i$个数上一次出现是在哪里。
如,若$a_i={1,2,3,2,4,1,4,2}$,那么$last_i={0,0,0,2,0,1,5,4}$,这样,问题就变成了求在区间$[l,r]$内,有多少个数小于$l$。
用主席树求就好啦。
Code(莫队)
|
|
Code(主席树)
|
|