为什么我的答案都比标准答案大一?
查看原帖
为什么我的答案都比标准答案大一?
575994
Hisaishi_Kanade楼主2023/1/2 20:52

如题。

#include <math.h>
#include <stdio.h>
#include <algorithm>
static int len;
static long long ret;
long long res[100005];
int cnt[100005],a[100005];
class line
{
public:
	int l,r,id;
	line(int x=0,int y=0,int z=0):l(x),r(y),id(z)
	{}
	inline const bool operator<(const line &other)
	const{
		if((l-1)/len==(other.l-1)/len)
			return r<other.r;
		else
			return l/len<other.l/len;
	}
}e[100005];
inline void add(int x)
{
	ret+=2*cnt[x]+1;
	++cnt[x];
}
inline void del(int x)
{
	ret-=2*cnt[x]-1;
	--cnt[x];
}
int main()
{
	int i,l,r,n,m,k;
    l=r=0;
	scanf("%d %d %d",&n,&m,&k);
	len=int(sqrt(n));
	for(i=1;i<=n;++i)
		scanf("%d",a+i);
	for(i=1;i<=m;++i)
	{
		e[i].id=i;
		scanf("%d %d",&e[i].l,&e[i].r);
	}
	std::sort(e+1,e+m+1);
	for(i=1;i<=m;++i)
	{
		while(l>e[i].l)
			add(a[--l]);
		while(r<e[i].r)
			add(a[++r]);
		while(l<e[i].l)
			del(a[l++]);
		while(r>e[i].r)
			del(a[r--]);
		res[e[i].id]=ret;
	}
	for(i=1;i<=m;++i)
		printf("%lld\n",res[i]);
	return 0;
}
2023/1/2 20:52
加载中...