P2709 小B的询问
2017-06-27 20:09
162 查看
题目描述
小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。输入输出格式
输入格式:第一行,三个整数N、M、K。
第二行,N个整数,表示小B的序列。
接下来的M行,每行两个整数L、R。
输出格式:
M行,每行一个整数,其中第i行的整数表示第i个询问的答案。
输入输出样例
输入样例#1:6 4 3 1 3 2 1 1 3 1 4 2 6 3 5 5 6
输出样例#1:
6 9 5 2
说明
对于全部的数据,1<=N、M、K<=50000裸莫队。
对于求平方可以先减去,再加回来‘
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int MAXN=50001; void read(int & n) { char c='+';int x=0;bool flag=0; while(c<'0'||c>'9') {c=getchar();if(c=='-')flag=1;} while(c>='0'&&c<='9') {x=x*10+(c-48);c=getchar();} flag==1?n=-x:n=x; } int n,m,k,base; struct node { int l,r,id; }q[MAXN]; int ans=0; int pos[MAXN],a[MAXN],out[MAXN]; int comp(const node & a,const node & b) { if(pos[a.l]==pos[b.l]) return a.r<b.r; else return pos[a.l]<pos[b.l]; } int happen[MAXN];// 记录区间内每一个数的出现次数 void add(int p) { if(p<=k) { ans-=happen[p]*happen[p]; happen[p]++; ans+=happen[p]*happen[p]; } } void dele(int p) { if(p<=k) { ans-=happen[p]*happen[p]; happen[p]--; ans+=happen[p]*happen[p]; } } void modui() { int ll=1,rr=0; for(int i=1;i<=m;i++) { for(;q[i].l<ll;ll--) add(a[ll-1]); for(;q[i].l>ll;ll++) dele(a[ll]); for(;q[i].r<rr;rr--) dele(a[rr]); for(;q[i].r>rr;rr++) add(a[rr+1]); out[q[i].id]=ans; } for(int i=1;i<=m;i++) printf("%d\n",out[i]); } int main() { read(n);read(m);read(k); for(int i=1;i<=n;i++) read(a[i]); base=sqrt(n); for(int i=1;i<=n;i++) pos[i]=(i-1)/base+1; for(int i=1;i<=m;i++) { int x,y; read(x);read(y); q[i].l=x;q[i].r=y;q[i].id=i; } sort(q+1,q+m+1,comp); modui(); return 0; }
相关文章推荐
- P2709 小B的询问
- 洛谷 P2709 小B的询问 莫队算法
- 【P2709】【BZOJ3781】 小B的询问 莫队算法
- AC日记——小B的询问 洛谷 P2709
- P2709 小B的询问
- P2709 小B的询问
- P2709 小B的询问
- 洛谷--------P2709 小B的询问
- 【洛谷P2709】小B的询问
- 洛谷 P2709 BZOJ 3781 小B的询问
- 洛谷P2709 BZOJ 3781 小B的询问 (莫队)
- P2709 小B的询问(莫队)
- [P2709]小B的询问
- 洛谷 P2709 小B的询问
- 关于定时关闭询问对话框的一点体会
- [集中回复]来信询问C++电梯程序的问题
- 面试官询问的刁钻问题——以及如何巧妙地应付它们
- 被上帝莫名其妙挑了筋 询问其原因 未果
- 退出窗体时询问
- wince 配置文件询问