题意:给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R(1≤L,R≤n)。
对于每个询问,输出a[1...L]和a[R...n]的不同数字的个数。
这道题有两种写法:莫队/树状数组
这是莫队的模板题,这里不多讲(然而在学习莫队之前搞定这个难于上青天)
树状数组的做法是:
把区间【1,n】延长到【1,2n】
这样就把不连续的两个区间化成一个整区间,加入需要查询的是整区间【l,r】,
可以通过预处理将这个区间与前面的区间不同的中暑求出,而【l,r】区间与【1,l)区间相同的种数可以通过树状数组维护;
这是一个相对玄学的树状数组,真的,只是我有史以来做过的树状数组最神奇的题。
将查询离线然后对左端点进行排序,用一个nex【】数组记录下一个下标的当前值的位置;
左值不断右移(即不断接近查询的左端点)然后将nex【】放到树状数组里面的位置里去,这样就很神奇的能都维护【1,l)和【l,r】同时出现过的数了。