莫队算法-离线查询区间内部不同数字的个数
Posted bluefly-hrbust
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了莫队算法-离线查询区间内部不同数字的个数相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; const int maxx = 1e6+6; int a[maxx]; int vis[maxx]; int ans[maxx]; int block; int res; struct node int l,r; int id; friend bool operator < (node &a,node &b) if (a.l/block==b.l/block) return a.r<b.r; return a.l/block<b.l/block; que[maxx]; void add(int x) vis[a[x]]++; if (vis[a[x]]==1) res++; void del(int x) vis[a[x]]--; if (vis[a[x]]==0) res--; int main() int n,q; while(~scanf("%d",&n)) res=0; block=sqrt(n); memset(vis,0,sizeof(vis)); for (int i=1; i<=n; i++) scanf("%d",&a[i]); scanf("%d",&q); int l=1,r=0; for (int i=1; i<=q; i++) scanf("%d%d",&que[i].l,&que[i].r); que[i].id=i; sort(que+1,que+1+q); for (int i=1; i<=q; i++) while(l<que[i].l)del(l),l++; while(l>que[i].l)l--,add(l); while(r<que[i].r)r++,add(r); while(r>que[i].r)del(r),r--; ans[que[i].id]=res; for (int i=1;i<=q;i++) if (i-1)printf(" %d",ans[i]); else printf("%d",ans[i]); return 0;
以上是关于莫队算法-离线查询区间内部不同数字的个数的主要内容,如果未能解决你的问题,请参考以下文章
D. Powerful array 离线+莫队算法 给定n个数,m次查询;每次查询[l,r]的权值; 权值计算方法:区间某个数x的个数cnt,那么贡献为cnt*cnt*x; 所有贡献和即为该区间的值;