题目大意:给定一个序列,多次询问某个区间中所有数字出现次数的平方和
莫队算法 不解释
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 50500 using namespace std; struct query{ int l,r,pos; bool operator < (const query &Y) const; }q[M]; int n,m,k,block,a[M]; int l=1,r=0,cnt[M]; unsigned int now,ans[M]; bool query :: operator < (const query &Y) const { if( (l>>8) != (Y.l>>8) ) return l < Y.l; return r < Y.r; } inline void Update(int x,int y) { now-=cnt[x]*cnt[x]; cnt[x]+=y; now+=cnt[x]*cnt[x]; } int main() { int i; cin>>n>>m>>k; for(i=1;i<=n;i++) scanf("%d",&a[i]); block=static_cast<int>(sqrt(n)+1e-7); for(i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].pos=i; sort(q+1,q+m+1); for(i=1;i<=m;i++) { while(r<q[i].r) Update(a[++r],1); while(l>q[i].l) Update(a[--l],1); while(r>q[i].r) Update(a[r--],-1); while(l<q[i].l) Update(a[l++],-1); ans[q[i].pos]=now; } for(i=1;i<=m;i++) printf("%u\n",ans[i]); }
原文地址:http://blog.csdn.net/popoqqq/article/details/41549353