莫队模板
模板题:洛谷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]); }