莫队 全RE
查看原帖
莫队 全RE
890346
Autumn_0930楼主2024/7/17 20:18
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int n,m,sq,sum=0,cnt[N],ans[N],a[N];
struct node{
	int l,r,num;
}q[N];
bool cmp(node n1,node n2){
	if(n1.l/sq==n2.r/sq) return n1.r<=n2.r;
	return n1.l/sq<n2.l/sq;
}
void add(int x){
	int t1=pow(cnt[a[x]],2);
	cnt[a[x]]++;
	int t2=pow(cnt[a[x]],2);
	sum=sum+t2-t1;
}
void sub(int x){
	int t1=pow(cnt[a[x]],2);
	cnt[a[x]]--;
	int t2=pow(cnt[a[x]],2);
	sum=sum+t2-t1;
}
int main(){
	cin>>n>>m>>sq;
	sq=sqrt(n);
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++){
		cin>>q[i].l>>q[i].r;
		q[i].num=i;
	}
	int L=1,R=0;
	sort(q+1,q+1+m,cmp);
	for(int i=1;i<=m;i++){
		int l=q[i].l,r=q[i].r;
		while(L>l) add(--L);
		while(R<r) add(++R);
		while(L<l) sub(L++);
		while(R>r) sub(R--);
		ans[q[i].num]=sum;
	}
	for(int i=1;i<=m;i++) cout<<ans[i]<<endl;
	return 0;
}
2024/7/17 20:18
加载中...