这就是个普通莫队,基本是模板题
我刚在别的oj做了一道莫队题,过来想找点莫队,结果一看,这不一样吗,于是就水过去了
解释见博客
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 5e4 + 4;
const int M = 2e5 + 3;
struct stu{
int l,r;
int id;
int block;
bool operator <(const stu &x) const {
if(x.block == block)
if(block & 1) return x.r < r;
else return x.r > r;
return x.block < block;
}
}q[M];
int n,m;
int a[N];
int ans[M];
int cnt[1000006];
int cur_ans;
void add(int pos)
{
int x = a[pos];
cnt[x] ++;
if(cnt[x] == 1) cur_ans ++;
}
void del(int pos)
{
int x = a[pos];
cnt[x] --;
if(!cnt[x]) cur_ans --;
}
int main()
{
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i];
cin >> m;
int div = n / sqrt(n);
for(int i = 1;i <= m;i ++)
{
cin >> q[i].l >> q[i].r;
q[i].id = i;
q[i].block = q[i].l / div;
}
sort(q + 1,q + 1 + m);
int l = 1;
int r = 0;
for(int i = 1;i <= m;i ++)
{
while(l < q[i].l) del(l ++);
while(l > q[i].l) add(-- l);
while(r < q[i].r) add(++ r);
while(r > q[i].r) del(r --);
ans[q[i].id] = cur_ans;
}
for(int i = 1;i <= m;i ++)
cout << ans[i] << endl;
return 0;
}