莫队暴力 一知半解

区间找种类吧

一个区间,给你好多区间,然后问有多少种;

分块优化,将区间询问分块处理

然后两个指针一样的东西,走遍天下顺便把答案给你;

所以指针直接从头走到尾岂不是时间很优,所以要把询问区间排序

看不懂还是看大神博客吧

https://www.cnblogs.com/WAMonster/p/10118934.html

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1000000;
struct node
{
    int l,r,id;
}qu[maxn];
int n,q,a[maxn];
int len,tot,b[maxn];
int cnt[maxn],ll=1,rr=0,now=0;
bool cmp(node x,node y)
{
    if(b[x.l]==b[y.l]) return x.r<y.r;
    else return x.l<y.l;
}
/*int cmp(node x,node y) {
    return (b[x.l] ^ b[y.l]) ? b[x.l] < b[y.l] : ((b[x.l] & 1) ? x.r < y.r : x.r > y.r);
}*/

void add(int pos)
{
    if(!cnt[a[pos]]) ++now;
    ++cnt[a[pos]];
}

void del(int pos)
{
    --cnt[a[pos]];
    if(!cnt[a[pos]]) now--;
}

int ans[maxn];
int main()
{
    scanf("%d",&n);
    len=sqrt(n);
    tot=n/len;
    if(n%len) tot++;
    
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        b[i]=(i-1)/len+1;
    }
    
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%d%d",&qu[i].l,&qu[i].r);
        qu[i].id=i;
    }
    sort(qu+1,qu+q+1,cmp);
    for(int i=1;i<=q;i++)
    {
        int ql=qu[i].l;
        int qr=qu[i].r;
        while(ll<ql) del(ll++);
        while(ll>ql) add(--ll);
        while(rr>qr) del(rr--);
        while(rr<qr) add(++rr);
        ans[qu[i].id]=now; 
    }
    for(int i=1;i<=q;i++) printf("%d
",ans[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/WHFF521/p/11178373.html