LightOJ 1188 Fast Queries(离线树状数组)
2016-02-28 20:23
465 查看
描述
Given an array of N integers indexed from 1 to N, and q queries, each in the form i j, you have to find the number of distinct integers from index i to j(inclusive).
输入
Input starts with an integer T (≤ 5), denoting the number of test cases.
The first line of a case is a blank line. The next line contains two integers N (1 ≤ N ≤ 105), q (1 ≤ q ≤ 50000). The next line contains N space separated integers forming the array. There integers
range in [0, 105].
Each of the next q lines will contain a query which is in the form i j (1 ≤ i ≤ j ≤ N).
输出
For each test case, print the case number in a single line. Then for each query you have to print a line containing number of distinct integers from index i to j.
样例输入
1
8 5
1 1 1 2 3 5 1 2
1 8
2 3
3 6
4 5
4 8
样例输出
Case 1:
4
1
4
2
4
这题的题意就是给你一个数组,q次询问,每次询问的区间内有几个不同的数。
这题的话就是离线处理每次的操作,先把询问按照r的大小排序,然后每次找的话有重复的就把前面的更新为0,后面的更新为1,然后求个区间和就好了,比如样例1 的第三组数据,这时候的值为 0 0 1 1 1 1,所以3 6 为4.
Given an array of N integers indexed from 1 to N, and q queries, each in the form i j, you have to find the number of distinct integers from index i to j(inclusive).
输入
Input starts with an integer T (≤ 5), denoting the number of test cases.
The first line of a case is a blank line. The next line contains two integers N (1 ≤ N ≤ 105), q (1 ≤ q ≤ 50000). The next line contains N space separated integers forming the array. There integers
range in [0, 105].
Each of the next q lines will contain a query which is in the form i j (1 ≤ i ≤ j ≤ N).
输出
For each test case, print the case number in a single line. Then for each query you have to print a line containing number of distinct integers from index i to j.
样例输入
1
8 5
1 1 1 2 3 5 1 2
1 8
2 3
3 6
4 5
4 8
样例输出
Case 1:
4
1
4
2
4
这题的题意就是给你一个数组,q次询问,每次询问的区间内有几个不同的数。
这题的话就是离线处理每次的操作,先把询问按照r的大小排序,然后每次找的话有重复的就把前面的更新为0,后面的更新为1,然后求个区间和就好了,比如样例1 的第三组数据,这时候的值为 0 0 1 1 1 1,所以3 6 为4.
/* *********************************************** Author :yzkAccepted Created Time :2016/2/28 10:16:32 TASK :ggfly.cpp LANG :C++ ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <cstdlib> #include <ctime> #include <stack> using namespace std; const int maxn=1e6+5; struct node{ int l,r; int idx; }p[maxn]; int b[maxn],n,q,ans[maxn],vis[maxn],c[maxn]; bool cmp(node a,node b) { return a.r<b.r; } void add(int i,int v) { while(i<=n) { b[i]+=v; i+=i&(-i); } } int sum(int i) { int res=0; while(i>0) { res+=b[i]; i-=i&(-i); } return res; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int t,cas=1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) scanf("%d",&c[i]); memset(vis,0,sizeof(vis)); memset(b,0,sizeof(b)); for(int i=1;i<=q;i++) { scanf("%d %d",&p[i].l,&p[i].r);p[i].idx=i;} sort(p+1,p+q+1,cmp); int cnt=1; for(int i=1;i<=n;i++) { add(i,1); if(vis[c[i]]) add(vis[c[i]],-1); vis[c[i]]=i; while(cnt<=q && p[cnt].r==i) { ans[p[cnt].idx]=sum(p[cnt].r)-sum(p[cnt].l-1); cnt++; } if(cnt>q) break; } printf("Case %d:\n",cas++); for(int i=1;i<=q;i++) { printf("%d\n",ans[i]); } } return 0; }
相关文章推荐
- Codeforces Coder-Strike 2014 - Finals (online edition, Div. 1)
- HDU 1166 敌兵布阵
- POJ 2352 Stars
- PAT 1057 Stack (30)
- neu 1438 树状数组求逆序数
- poj 2352
- 树状数组
- hdu 4630 No Pain No Game 树状数组
- 树状数组区间求和的三种模型
- HDOJ1166 敌兵布阵 树状数组
- 二维树状数组
- Hoj 2275 Number Sequence
- POJ3321 Apple Tree
- BZOJ2434 [Noi2011]阿狸的打字机【AC自动机+dfs序+树状数组】
- HDU 3015
- hdu 5147
- 【转载】区间信息的维护与查询(一)——二叉索引树(Fenwick树、树状数组)
- codeforces628 E. Zbazi in Zeydabad 选择枚举对象+用顺序减少重复计算+树状数组优化
- 树状数组模板
- HLG 1400 汽车比赛