莫队暴力 一知半解
题目
区间找种类吧
一个区间,给你好多区间,然后问有多少种;
分块优化,将区间询问分块处理
然后两个指针一样的东西,走遍天下顺便把答案给你;
所以指针直接从头走到尾岂不是时间很优,所以要把询问区间排序
看不懂还是看大神博客吧
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\n",ans[i]); return 0; }