【BZOJ】【P3781】【小B的询问】【莫队】【400T留念】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3781

无脑莫队

400T留念

【BZOJ】【P3781】【小B的询问】【莫队】【400T留念】_第1张图片

Code:

#include<bits/stdc++.h>
#define sqr(x) ((x)*(x))
using namespace std;
const int maxn=50010;
int n,m,k,sqrtn;
int getint(){
	int res=0;char c=getchar();
	while(!isdigit(c))c=getchar();
	while(isdigit(c))res=res*10+c-'0',c=getchar();
	return res;
}
int a[maxn],anss[maxn];
int c[maxn],L,R;
int ans=0;
struct qes{
	int l,r,id;
	bool operator<(qes oth)const{
		return l/sqrtn<oth.l/sqrtn||(l/sqrtn==oth.l/sqrtn&&r<oth.r);
	}
}q[maxn];
int main(){
	n=getint();m=getint();k=getint();sqrtn=sqrt(n);
	for(int i=1;i<=n;i++)a[i]=getint();
	for(int i=1;i<=m;i++)
		q[i].l=getint(),q[i].r=getint(),q[i].id=i;
	sort(q+1,q+1+m);
	c[a[1]]++;L=R=1;ans=1;
	for(int i=1;i<=n;i++){
		while(L>q[i].l){
			L--;
			c[a[L]]++;
			ans=ans-sqr(c[a[L]]-1)+sqr(c[a[L]]);
		}
		while(R<q[i].r){
			R++;
			c[a[R]]++;
			ans=ans-sqr(c[a[R]]-1)+sqr(c[a[R]]);			
		}
		while(L<q[i].l){
			c[a[L]]--;
			ans=ans-sqr(c[a[L]]+1)+sqr(c[a[L]]);
			L++;
		}
		while(R>q[i].r){
			c[a[R]]--;
			ans=ans-sqr(c[a[R]]+1)+sqr(c[a[R]]);	
			R--;		
		}anss[q[i].id]=ans;
	}
	for(int i=1;i<=m;i++)printf("%d\n",anss[i]);
	return 0;	
}


你可能感兴趣的:(bzoj)