#0004.「HEOI2012」采花
题目大意:
给定n个1-m的数,q次询问,每次询问一个区间内出现次数大于1的数的个数。
题目解法:
莫队!
既然我们已经想到了莫队就可以考虑离线做法了。将所有区间按l排序。
对于给定的左端点,我们可以建一个0 1数组,当且仅当该位置的数第二次出现时放1,其他放0。那么显然我们的答案可以通过该数组的前缀和得到。bit维护下可以实现O(log n)查询
再考虑左端点向右移动造成的变化。我们用nxt[i]表示位置i后面第一个颜色相同的位置。显然左端点从i移动到i+1前,nxt[i]的位置应该放1。但左端点右移后nxt[i]将不再是当前区间内该数字第二次出现的位置,nxt[nxt[i]]才是。所以每次查询后的更新即为update(nxt[i],-1),update(nxt[nxt[i]],1)
这样每次查询是O(log n),每次左端点移动是O(log n),总的时间复杂度就是O(n log n)

浙公网安备 33010602011771号