T了,求优化
查看原帖
T了,求优化
723989
zhangjizhi楼主2025/1/17 09:28

rt

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
int n,m,k,a[50001],ans,cx[50001],sum[50001],t,l,r,pos[50001];
inline int read()
{
	int x=0,fh=1;
	char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-') fh=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	return x*fh;
}
struct WEN
{
	int x,y,id;
}q[50001];
bool cmp(WEN a,WEN b)
{
	if(pos[a.x]==pos[b.x])
	{
		return a.y<b.y;
	}
	return pos[a.x]<pos[b.x];
}
int ad(int x)
{
	cx[a[x]]++;
	ans+=cx[a[x]]*cx[a[x]]-(cx[a[x]]-1)*(cx[a[x]]-1);
}
int qu(int x)
{
	cx[a[x]]--;
	ans+=cx[a[x]]*cx[a[x]]-(cx[a[x]]+1)*(cx[a[x]]+1);
}
signed main()
{
//	freopen("P2709_1.in","r",stdin);
	n=read(),m=read(),k=read();
	t=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		pos[i]=i/t+1;
	}
	for(int i=1;i<=m;i++)
	{
		q[i].x=read(),q[i].y=read();
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	l=1,r=0;
	for(int i=1;i<=m;i++)
	{
		while(l<q[i].x) qu(l++);
		while(l>q[i].x) ad(--l);
		while(r<q[i].y) ad(++r);
		while(r>q[i].y) qu(r--);
		sum[q[i].id]=ans;
	}
	for(int i=1;i<=m;i++)
	{
		printf("%d\n",sum[i]);
	}
	return 0;
}
2025/1/17 09:28
加载中...