LightOJ - 1188 Fast Queries(离线树状数组)

原创 2015年11月21日 01:26:42

                                                                                                   Fast Queries

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

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

Output

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.

Sample Input

Output for Sample Input

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

Note


题意:求区间不同数的个数。

题解:离线树状数组。把查询区间按右区间升序排序,然后把数组逐个插入,

          对于当前a[i],如果之前出现过了,则把上次出现的位置 -1,当前位置 +1.

          然后若有查询区间的右区间等于i,查询该区间,把答案保存下来。

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
#include <iostream>

using namespace std;
const int N = 100010;

int n,q;
struct node {
    int l,r;
    int id;
} Q[N*5];

int vis[N],a[N];
int ans[N*5];

bool cmp(node a,node b) {
    return a.r<b.r;
}

int bit[N];

void add(int i,int v) {
    while(i<=n) {
        bit[i]+=v;
        i+=i&-i;
    }
}

int sum(int i) {
    int res=0;
    while(i>0) {
        res+=bit[i];
        i-=i&-i;
    }
    return res;
}

int main() {
    //freopen("test.in","r",stdin);
    int t,ca=1;
    cin>>t;
    while(t--) {
        scanf("%d%d",&n,&q);
        for(int i=1; i<=n; i++)scanf("%d",&a[i]);
        for(int i=1; i<=q; i++) {
            scanf("%d%d",&Q[i].l,&Q[i].r);
            Q[i].id=i;
        }
        sort(Q+1,Q+q+1,cmp);
        memset(bit,0,sizeof bit);
        memset(vis,0,sizeof vis);
        int la=1;
        for(int i=1; i<=n; i++) {
            add(i,1);
            if(vis[a[i]])add(vis[a[i]],-1);
            vis[a[i]]=i;
            while(la<=q&&Q[la].r==i) {
                ans[Q[la].id]=sum(Q[la].r)-sum(Q[la].l-1);
                la++;
            }
            if(la>q)break;
        }
        printf("Case %d:\n",ca++);
        for(int i=1; i<=q; i++) {
            printf("%d\n",ans[i]);
        }
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

LightOJ 1188 Fast Queries(离线树状数组)

描述 Given an array of N integers indexed from 1 to N, and q queries, each in the form i j, you have ...
  • sinat_30126425
  • sinat_30126425
  • 2016年02月28日 20:23
  • 233

1188 - Fast Queries Lightoj

1.扫描线 2.使相同的点尽量靠右
  • Yukar_syt
  • Yukar_syt
  • 2012年08月08日 18:27
  • 1227

Light OJ 1188 Fast Queries (树状数组离线)

题目链接: http://lightoj.com/volume_showproblem.php?problem=1188 题意:查找一个区间内不同数字的个数。 分析: 离线做法...
  • swust_lian
  • swust_lian
  • 2016年08月06日 15:09
  • 217

Lightoj1188 Fast Queries(树状数组离线)

题意给出n个数,Q次询问l,r表示数组l到r区间内有多少种数字。 思路离线处理每个区间,把区间按照r的值从小到大排序。用vis[...]数组记录每个数前面出现的最近的位置。处理到位置i时,如果前面出现...
  • KIJamesQi
  • KIJamesQi
  • 2016年08月02日 22:55
  • 203

1188 - Fast Queries (莫队算法)

1188 - Fast Queries PDF (English) Statistics Forum Time Limit...
  • ZSGG_ACM
  • ZSGG_ACM
  • 2015年11月25日 11:53
  • 651

Light OJ 1188 Fast Queries(离线树状数组||莫队算法)

题目链接: http://lightoj.com/volume_showproblem.php?problem=1188 题目大意: 给一串长为n的序列,然后有m个区间询问。要求得到询问区间范围内不...
  • aaaaacmer
  • aaaaacmer
  • 2016年03月03日 21:53
  • 460

LightOj 1188 树状数组

LightOj 1188 题目链接: http://www.bnuoj.com/v3/problem_show.php?pid=13000 题意: 给一个数列(len ...
  • beihai2013
  • beihai2013
  • 2016年01月17日 23:44
  • 109

lightoj1100 - Again Array Queries

1100 - Again Array Queries PDF (English) Statistics Forum Time Limit: ...
  • R1986799047
  • R1986799047
  • 2015年10月25日 17:08
  • 269

LightOJ 1118 树状数组+离线

题目大意:给出一个序列,每次询问(l,r)区间的不同的数的个数 思路:将每个询问按照r升序排序,若当前到达i,a[i]出现过,则之前位置-1,当前位置+1,若没有出现过则当前位置+1 为什么要su...
  • Lifel
  • Lifel
  • 2017年09月01日 17:11
  • 74

Light OJ 1188 Fast Queries(分块暴力)

In a strange city, houses are built in a straight line one after another. There are several communit...
  • u013582254
  • u013582254
  • 2015年08月17日 19:30
  • 551
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LightOJ - 1188 Fast Queries(离线树状数组)
举报原因:
原因补充:

(最多只允许输入30个字)