首页 > 代码库 > BZOJ 3781 小B的询问 莫队算法
BZOJ 3781 小B的询问 莫队算法
题目大意:给定一个序列,多次询问某个区间中所有数字出现次数的平方和
莫队算法 不解释
#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]); }
BZOJ 3781 小B的询问 莫队算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。