萌新求问
查看原帖
萌新求问
710840
RuanHaoJun楼主2024/6/1 23:34

这是我的AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=50005;
struct node{
	int l,r,id;
}p[N];
ll ans[N],a[N],c[N],tot=0;
int n,m,k,T;

bool cmp(node x,node y)
{
	if(x.l/T==y.l/T) return x.r<y.r;
	else return x.l<y.l;
}

void add(int x) { tot+=2*c[a[x]]+1,c[a[x]]++; }
void del(int x) { tot-=2*c[a[x]]-1,c[a[x]]--; }

int main()
{
	cin>>n>>m>>k;
	T=int(n*1.0/sqrt(m*1.0));
	for(int i=1;i<=n;i++) scanf("%lld",a+i);
	for(int i=1;i<=m;i++) scanf("%d%d",&p[i].l,&p[i].r),p[i].id=i;
	sort(p+1,p+1+m,cmp);
	for(int x=1;x<=m;x++)
	{
		int la=p[x-1].l,ra=p[x-1].r;
		int lb=p[x].l,rb=p[x].r;
		while(la>lb) la--,add(la);
		while(ra<rb) ra++,add(ra);
		while(la<lb) del(la),la++;
		while(ra>rb) del(ra),ra--;
		ans[p[x].id]=tot;
	}
	for(int i=1;i<=m;i++)
		printf("%lld\n",ans[i]-1);
	return 0;
}

但为什么是

printf("%lld\n",ans[i]-1);

而不是

printf("%lld\n",ans[i]);

呢?

2024/6/1 23:34
加载中...