题意:给定n个数,m个询问,每次回答某个区间内不相同的元素个数。
思路:这道题很像之前hdu上做过的一道 http://blog.csdn.net/u014664226/article/details/47307779
这是用树状数组离线做的,将询问排序,从头扫一遍,将将当前元素上次的出现的位置减一,本次出现的位置加一,如果该点有询问,记录答案。
今天学习了主席树,又用主席树做了一遍,思路和树状数组差不多。
主席树建新树的时候,如果当前元素出现过,那么把这个元素上次出现的位置减一,然后当前位置加一,如果没出现过就是普通的建树操作。
对于查询[l, r]我们只需要取出第r棵树,然后输出这棵树[l,r]之间的和即可。
这道题两种做法时间复杂度都是O(n*logn)。
#include
#include
#include
#include
#include
#include
#include
#include