暴力美学,通过分块的办法降低暴力的复杂度
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define LL long long
using namespace std;
class Type
{
public:
LL l,r,kuai,num;
}F[50005];
LL N,M,block;
LL color[50005];
LL cnt[50005];
LL ans[50005];
LL l[50005],r[50005];
bool cmp(Type a,Type b)
{
if(a.kuai==b.kuai)
return a.r<b.r;
return a.kuai<b.kuai;
}
LL gcd(LL a,LL b)
{
if(b==0) return a;
return gcd(b,a%b);
}
int main()
{
LL i;
scanf("%lld%lld",&N,&M);
for(i=1;i<=N;i++)
scanf("%I64d",&color[i]);
block=(LL)sqrt(1.0*N);
for(i=1;i<=M;i++)
{
scanf("%lld%lld",&F[i].l,&F[i].r);
l[i]=F[i].l;r[i]=F[i].r;
F[i].num=i;F[i].kuai=F[i].l/block;
}
sort(F+1,F+M+1,cmp);//离线处理询问
LL x=1,y=0;LL temp=0;
for(i=1;i<=M;i++)
{
while(x<F[i].l)
{
cnt[color[x]]--;
temp-=cnt[color[x]];
x++;
}
while(x>F[i].l)
{
x--;
temp+=cnt[color[x]];
cnt[color[x]]++;
}
while(y>F[i].r)
{
cnt[color[y]]--;
temp-=cnt[color[y]];
y--;
}
while(y<F[i].r)
{
y++;
temp+=cnt[color[y]];
cnt[color[y]]++;
}
ans[F[i].num]=temp;
}//维护一下分子,分母是固定的辣
for(i=1;i<=M;i++)
{
LL fenmu=r[i]-l[i]+1;
fenmu=(fenmu*(fenmu-1))/2;
LL fenzi=ans[i];
if(ans[i]==0)
{
printf("0/1\n");
continue;
}
LL tmp=gcd(fenmu,fenzi);
fenmu/=tmp;fenzi/=tmp;
printf("%lld/%lld\n",fenzi,fenmu);
}
return 0;
}