这篇博客起源于本人把一道 $pow(2,n)$ 的问题考虑成求组合数前缀和的问题qwq,于是接触到了这个新算法来总结一下
参考自这篇文章,写得太好了
首先是一道模板题
题目意思是,给出一个数组a,再给出多个区间,问这些区间里分别有多少不一样的数字
焗个栗子:比如给出的是这样一个数组,询问的两个区间是红色和绿色标注的区间
如果我们分别遍历每一个区间,复杂度就太高了,因此就有大佬提出这样一种算法——
首先定义双指针 $l$、$r$,初始化为 $l=0,r=-1$(表示此时区间内没有任何元素),然后用unorderd_map<int, int> map存储当前区间内每个元素的个数
看我们要求的第一个区间 $[0,5]$
$l$ 此时等于$0$,和所求区间的左端点相同,因此无需移动
$r$ 此时等于$-1$,在所求区间右端点的左侧,因此需要向右移
首先向右移一位变成 $0$,此时区间内添加了一个元素 5,因为map[5] = 0,元素5不存在于原来的区间里,因此元素种类数cnt加一,map[5] ++
然后 $r$ 再右移一位变成 1,此时区间内添加了一个元素 7,因为map[7] ...