#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)

posted @ 2020-05-12 17:05  Myrcella  阅读(123)  评论(0)    收藏  举报