Given a sequence of n numbers a1, a2, …, an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the subsequence ai, ai+1, …, aj. 
Input 
Line 1: n (1 ≤ n ≤ 30000). 
Line 2: n numbers a1, a2, …, an (1 ≤ ai ≤ 106). 
Line 3: q (1 ≤ q ≤ 200000), the number of d-queries. 
In the next q lines, each line contains 2 numbers i, j representing a d-query (1 ≤ i ≤ j ≤ n). 
Output 
For each d-query (i, j), print the number of distinct elements in the subsequence ai, ai+1, …, aj in a single line.

Example 
Input 

1 1 2 1 3 

1 5 
2 4 
3 5

Output 



题意就是查询区间不同元素的个数,有两种解法。 
解法1:离线+树状数组,先把询问离线,并且按照右端点排序,然后从小区间开始,然后树状数组的含义就是指以当前r为结尾的前缀区间的元素种类数,简单点说,就是我当前扫到l , r区间,把l - r区间还没在树状数组上更新的值,更新一遍,在之前已经存在了的值先删掉再更新一遍,确保我确定的元素都是往r靠的,这样才能保证求取区间正确。举个栗子吧:比如我 1 2 2 1 3,当我r移到3的时候,加入前面的1还没在树状数组里更新过(但其实之前已经有读过1了)那就把之前的1的影响删掉,重新在这个3左边这个下标为4的位置给树状数组 add 1.这样确保之后不管我是查询 4 5 或者 1 5,元素1都只算了一次,但都没遗落(想想如果元素1一直在下标1那里,我查询4 5,就不会有1了)

#include<bits/stdc++.h>
using namespace std;
const int maxn=300010;
const int maxq=1000010;
map<int,int>mp;
struct node
{int l,r,id;//输入查询的区间//id记录的是每个查询的次序,目的是在对查询区间排序后,能按原来的查询顺序输出结果
};
node q[maxq];
bool cmp(node a,node b)
{return a.r<b.r;
}
int c[maxn],n;
int lowbit(int x)
{return x&(-x);
}int sum(int x)
//int query(int x)
{int res=0;while(x){res+=c[x];x-=lowbit(x);}return res;
}
void add(int x,int val)
{while(x<=n){c[x]+=val;x+=lowbit(x);}
}int a[maxn],ans[maxq];
int main()
{int i,j,cur,Q;while(~scanf("%d",&n)){mp.clear();memset(c,0,sizeof(c));for(i=1;i<=n;i++)scanf("%d",&a[i]);scanf("%d",&Q);for(i=1;i<=Q;i++){scanf("%d%d",&q[i].l,&q[i].r);q[i].id=i;}sort(q+1,q+1+Q,cmp);//按右端点排序cur=1;for(i=1;i<=Q;i++){for(j=cur;j<=q[i].r;j++){if(mp.find(a[j])!=mp.end())//在前面出现过{add(mp[a[j]],-1);}mp[a[j]]=j;add(j,1);}cur=q[i].r+1;ans[q[i].id]=sum(q[i].r)-sum(q[i].l-1);}//一开始cur=1,是1到q[1].r,先对这个小区间操作,然后cur=q[1].r+1//是q[1].r到q[2].r,继续下去for(i=1;i<=Q;i++)printf("%d\n",ans[i]);}
}

SPOJ D-query 树状数组离线 求区间内不同数字的个数相关推荐

  1. 用树状数组解决求区间最值的问题:hdu1754

    以前都学过树状数组,但是已经差不多忘记了!不过看一看后,马上就都回忆起来了!而且感觉经过这么久的学习,对树状数组有了更深一层的领悟!个人觉得树状数组在本质上与线段树是没有区别的!都是管理区间,只不过树 ...

  2. hud 3874 求区间内不同数字的和

    http://acm.hdu.edu.cn/showproblem.php?pid=3874 和求区间内不同数字的个数一样. //#include<bits/stdc++.h> //usi ...

  3. HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景

    http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...

  4. 树状数组(求子区间和+更新元素值)

    树状数组 欲完成修改值和查询区间和两种操作 求前缀和的做法时间复杂度为O(n)O(n)O(n) 使用树状数组时间复杂度降为O(logn)O(logn)O(logn) lowbit 1.x&(- ...

  5. 树状数组(求逆序对)

    一.树状数组是什么 树状数组,又称二进制索引树,英文名Binary Indexed Tree 之前遇到一个求逆序对的题,看了很多题解都只说了这个树状数组,关于怎么实现的全都避而不谈,我研究了一下午,总 ...

  6. SPOJ 3267: DQUERY 树状数组,离线算法

    给出q个询问,询问一段区间里面的不同元素的个数有多少个. 离线做,用树状数组. 设树状数组的意义是:1--pos这个段区间的不用元素的种类数.怎么做?就是add(pos,1);在这个位置中+1,就是说 ...

  7. hdu 4417(树状数组+离线算法)

    解题思路:这道题要求某区间内比h小的个数,其实这里可以类似于树状数组求逆序数那样.关键是如何转换成树状数组的模型,这才是本题的难点. 我们首先分析,如果知道h在该区间的哪个位置,那么剩下的就很好做了. ...

  8. 2019 南京 网络赛 B (二维偏序,树状数组离线)

    题意: 给出一N*N的蛇形矩阵,具体位置元素值不给你,自己找规律,然后给你M个 有效位置,P次查询,每次查询一个子矩阵中有效元素的权值和,该权值和等于对于 每个有效元素,模10拆分后相加得到的和.(注 ...

  9. hdu 3333 树状数组+离线处理

    思路:既然要求的是不同的元素的和,那么我们可以想办法让每个值在区间中只出现一次,于是想到了离线的算法:将查询按照右端点排序,位置在右端点之前的元素都插入到树状数组中,对于已经出现过的值,我们要先删除( ...

最新文章

  1. mysql数据更新回退_Mysql的几个灵魂拷问(一)
  2. 一个装作异步的代码段
  3. FreeTextBox的ToolbarButton整理
  4. 在Project 2010中添加自定义任务窗格
  5. Spring Boot 集成 RabbitMq 实战操作(二)
  6. 数据结构与算法 / 排序算法(2)
  7. QT的QWriteLocker类的使用
  8. mysql之存储引擎和文件配置
  9. ICLR 2019提交截止,近1600篇论文已全部上线
  10. 回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列
  11. docunment对象
  12. Spark源码系列(二)RDD详解 - 岑玉海
  13. alanwang[GDOU] 简单练习 判断一个年份是否为闰年
  14. 文件夹名称有英语如何翻译为中文重命名
  15. Excel中通过FREQUENCY统计分数段
  16. 穆斯林的葬礼-(爱情,是人类最美好的感情)
  17. Linux 下的chromium浏览器出现no internet connection错误
  18. U盘用哪种格式化比较好?教你一步,详细区分U盘格式
  19. 实验二+001+陈定国
  20. 2022年,人工智能将成为医疗保健行业的转折点

热门文章

  1. java实现兵乓球比赛_C语言实现乒乓球比赛
  2. python去重复排序_Python实现删除排序数组中重复项的两种方法示例
  3. python做excel自动化-Python控制Excel实现自动化办公
  4. 无基础学python能干什么-呼市学Python语言能干什么
  5. python怎么读-Python怎么读?为什么叫Python?
  6. python编程语言-python与其他编程语言区别全在这
  7. python基础知识-Python基础知识点总结
  8. python全套完整教程-Python全套教程
  9. python爬虫菜鸟教程-Python爬虫学习100练001
  10. 你怎么看当前中文语音识别技术在国内的应用?