莫队模板

模板题:洛谷1972

  注意:此题数据较强,使用莫队仅能得80

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
inline int qread(){
    register int ch = getchar(), x = 0;
    while(ch < '0' || ch > '9')    ch = getchar();
    while(ch >= '0'    && ch <= '9')    x = 10 * x + ch - 48, ch = getchar();
    return x;
}
const int maxn = 500010;
const int maxm = 500010;
const int maxk = 1000010;
int data[maxn];
int len;
int mmp[maxk];
int ans[maxm];
int n, m;
struct query{
    int l, r, block, id;
    query(){}
    query(int L, int R, int ID){
        l = L, r = R, id = ID, block = l / len;
    }
    bool operator < (query b)const{
        return block == b.block? r < b.r : block < b.block;
    }
}queries[maxm];
int L = 1, R = 1, cnt = 1;
void add(int x){if(!(mmp[x]++))    cnt++;}
void dec(int x){if(!(--mmp[x]))    cnt--;}
int main(void){
    n = qread();
    len = sqrt(n);
    for(int i = 1; i <= n; ++i)
        data[i] = qread();
    m = qread();
    for(int i = 1; i <= m; ++i){
        int x = qread(), y = qread();
        queries[i] = query(x, y, i);
    }
    sort(queries + 1, queries + m + 1);
    mmp[data[1]] = 1;
    for(int i = 1; i <= m; ++i){
        while(queries[i].r > R)    add(data[++R]);
        while(queries[i].l < L)    add(data[--L]);
        while(queries[i].r < R)    dec(data[R--]);
        while(queries[i].l > L)    dec(data[L++]);
        ans[queries[i].id] = cnt;
    }
    for(int i = 1; i <= m; ++i)
        printf("%d\n", ans[i]);
}

 

posted @ 2018-08-23 15:31  junk_yao  阅读(100)  评论(0编辑  收藏  举报