莫队算法-离线查询区间内部不同数字的个数

Posted bluefly-hrbust

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了莫队算法-离线查询区间内部不同数字的个数相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxx = 1e6+6;
int a[maxx];
int vis[maxx];
int ans[maxx];
int block;
int res;
struct node

    int l,r;
    int id;
    friend bool operator < (node &a,node &b)
    
        if (a.l/block==b.l/block)
        
            return a.r<b.r;
        
        return a.l/block<b.l/block;
    
 que[maxx];
void add(int x)

    vis[a[x]]++;
    if (vis[a[x]]==1)
        res++;

void del(int x)

    vis[a[x]]--;
    if (vis[a[x]]==0)
    
        res--;
    

int main()

    int n,q;
    while(~scanf("%d",&n))
    
        res=0;
        block=sqrt(n);
        memset(vis,0,sizeof(vis));
        for (int i=1; i<=n; i++)
        
            scanf("%d",&a[i]);
        
        scanf("%d",&q);
        int l=1,r=0;
        for (int i=1; i<=q; i++)
        
            scanf("%d%d",&que[i].l,&que[i].r);
            que[i].id=i;
        
        sort(que+1,que+1+q);
        for (int i=1; i<=q; i++)
        
            while(l<que[i].l)del(l),l++;
            while(l>que[i].l)l--,add(l);
            while(r<que[i].r)r++,add(r);
            while(r>que[i].r)del(r),r--;
            ans[que[i].id]=res;
        
        for (int i=1;i<=q;i++)
            if (i-1)printf(" %d",ans[i]);
            else printf("%d",ans[i]);
        
    
    return 0;

 

以上是关于莫队算法-离线查询区间内部不同数字的个数的主要内容,如果未能解决你的问题,请参考以下文章

D. Powerful array 离线+莫队算法 给定n个数,m次查询;每次查询[l,r]的权值; 权值计算方法:区间某个数x的个数cnt,那么贡献为cnt*cnt*x; 所有贡献和即为该区间的值;

莫队算法——暴力出奇迹

莫队算法

莫队算法~练习一

CodeForces - 220B 离散化+莫队算法

莫队算法~讲解