bzoj3781 小B的詢問(莫隊)


赤裸裸的莫隊。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 50005
using namespace std;
int n,m,k,a[N],f[N],ans=0,block=0,ANS[N];
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x*f;
}
struct query{
	int l,r,block,id;
}q[N];
inline bool cmp(query x,query y){
	return x.block==y.block?x.r<y.r:x.block<y.block;
}
bool vis[N];
void change(int x){
	ans-=f[a[x]]*f[a[x]];
	if(vis[x]) f[a[x]]--;
	else f[a[x]]++;
	vis[x]^=1;ans+=f[a[x]]*f[a[x]];
}
int main(){
//	freopen("a.in","r",stdin);
	n=read();m=read();k=read();block=sqrt(n);
	for(int i=1;i<=n;++i) a[i]=read();
	for(int i=1;i<=m;++i){
		q[i].l=read();q[i].r=read();q[i].id=i;
		q[i].block=(q[i].l-1)/block;
	}
	sort(q+1,q+m+1,cmp);int l=1,r=0;
	for(int i=1;i<=m;++i){
		for(;l<q[i].l;++l) change(l);
		for(;l>q[i].l;--l) change(l-1);
		for(;r<q[i].r;++r) change(r+1);
		for(;r>q[i].r;--r) change(r);
		ANS[q[i].id]=ans;
	}
	for(int i=1;i<=m;++i) printf("%d\n",ANS[i]);
	return 0;
}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com