BZOJ 3781: 小B的询问

来源:互联网 发布:解锁软件 编辑:程序博客网 时间:2024/06/05 00:53

3781: 小B的询问

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 850  Solved: 572
[Submit][Status][Discuss]

Description

小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。

Input

第一行,三个整数N、M、K。
第二行,N个整数,表示小B的序列。
接下来的M行,每行两个整数L、R。

Output

M行,每行一个整数,其中第i行的整数表示第i个询问的答案。

Sample Input

6 4 3
1 3 2 1 1 3
1 4
2 6
3 5
5 6

Sample Output

6
9
5
2

HINT

对于全部的数据,1<=N、M、K<=50000


莫队裸题

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>#include<iomanip>#include<map>#include<set>#include<vector>#include<queue>using namespace std;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;}const int N=5e4+10;int n,m,k,block,a[N],pos[N],frequence[N];long long ans;struct question{int l,r,id;long long ans;}q[N];inline bool cmp_q(question a,question b){return (pos[a.l]==pos[b.l])?a.r<b.r:a.l<b.l;}inline bool cmp_id(question a,question b){return a.id<b.id;}void initial(){n=read();m=read();int temp;temp=read();for(int i=1;i<=n;i++)a[i]=read();int block=floor(sqrt(n));for(int i=1;i<=n;i++)pos[i]=(i-1)/block+1;for(int i=1;i<=m;i++){q[i].l=read(),q[i].r=read(),q[i].id=i;}sort(q+1,q+1+m,cmp_q);}inline void update(int t,int x){ans+=(2*frequence[t]*x+1);frequence[t]+=x;}void solve(){for(int i=1,l=1,r=0;i<=m;i++){while(r<q[i].r)r++,update(a[r],1);while(r>q[i].r)r--,update(a[r+1],-1);while(l<q[i].l)l++,update(a[l-1],-1);while(l>q[i].l)l--,update(a[l],1);q[i].ans=ans;}sort(q+1,q+1+m,cmp_id);for(int i=1;i<=m;i++){printf("%d\n",q[i].ans);}}int main(){initial();solve();return 0;}



0 0
原创粉丝点击