莫队板子

Posted wifimonster

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了莫队板子相关的知识,希望对你有一定的参考价值。

#include<bits/stdc++.h>
using namespace std;
const int maxn=500004;
inline int read() {
    int x=0,w=1;
    char ch=getchar();
    while (ch<0||ch>9) {
        if(ch==-) w=-1;
        ch=getchar();
    }
    while (ch>=0&&ch<=9)
        x=(x<<3)+(x<<1)+ch-0, ch=getchar();
    return x*w;
}
inline void write(int x) {
    if (x<0) 
        putchar(-), x=-x;
    if (x>9) 
        write(x/10);
    putchar(x%10+0);
}
int n,s,cnt=0;
int a[maxn],tot[maxn*10],ans[maxn];
int bl[maxn];
struct node{
    int id,l,r;
}query[maxn];
inline bool operator < (const node &x,const node &y){
    int qx=x.l/s,qy=y.l/s;
    if(qx<qy) return true;
    else if(qx==qy&&x.r<y.r) return true;
    return false;
}
inline void del(int x){
    tot[a[x]]--;
    if(!tot[a[x]]) cnt--;
}
inline void ins(int x){
    tot[a[x]]++;
    if(tot[a[x]]==1) cnt++;
}
int main(){
    scanf("%d",&n);
    s=sqrt(n);
    for(register int i=1;i<=n;i++){
        a[i]=read();
    }int m;
    scanf("%d",&m);
    for(register int i=1;i<=m;i++){
        query[i].l=read(),query[i].r=read();
        query[i].id=i;
    }
    sort(query+1,query+m+1);
    int lasl=0,lasr=0;
    for(register int i=1;i<=m;i++){
        int l=query[i].l,r=query[i].r;
        while(lasl<l) del(lasl++);
        while(lasl>l) ins(--lasl);
        while(lasr<r) ins(++lasr);
        while(lasr>r) del(lasr--);
        ans[query[i].id]=cnt;
    }
    for(register int i=1;i<=m;i++) write(ans[i]),putchar(
);
}

 

以上是关于莫队板子的主要内容,如果未能解决你的问题,请参考以下文章

Different Integers(莫队板子)

数颜色 / 维护队列(带修莫队板子)

Codeforces Round #340 (Div. 2) E XOR and Favorite Number 莫队板子

P1494 [国家集训队]小Z的袜子(莫队算法)

CQOI2018异或序列 [莫队]

bzoj2120