#include <iostream>#include <cstdio>#include <cmath>#include <string.h>#define fo(a,b,c) for (a=b; a<=c; a++)#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std;
longlong a[50001];
longlong b[50001];
longlong c[50001];
longlong d[50001];
longlong fk[50001];
longlong ans[50001];
longlong ans2[50001];
longlong num[50001];
longlong n,m,i,j,k,sum,l,r;
float sq;
longlong gcd(longlong x,longlong y)
{
longlong r;
if (x==0)
return y;
r=x%y;
while (r)
{
x=y;
y=r;
r=x%y;
}
return y;
}
void qsort(longlong l,longlong r)
{
longlong i,j,k,mid,mid2;
i=l;
j=r;
mid=fk[(l+r)/2];
mid2=c[(l+r)/2];
while (i<=j)
{
while ((fk[i]<mid)||((fk[i]==mid)&&(c[i]<mid2))) i++;
while ((fk[j]>mid)||((fk[j]==mid)&&(c[j]>mid2))) j--;
if (i<=j)
{
k=fk[i];
fk[i]=fk[j];
fk[j]=k;
k=b[i];
b[i]=b[j];
b[j]=k;
k=c[i];
c[i]=c[j];
c[j]=k;
k=d[i];
d[i]=d[j];
d[j]=k;
i++;
j--;
}
}
if (l<j)
qsort(l,j);
if (i<r)
qsort(i,r);
return;
}
int main()
{
scanf("%d%d",&n,&m);
sq=sqrt(n);
fo(i,1,n)
scanf("%d",&a[i]);
fo(i,1,m)
{
scanf("%d%d",&b[i],&c[i]);
d[i]=i;
fk[i]=floor(b[i]/sq);
}
qsort(1,m);
l=b[1];
r=c[1];
sum=0;
fo(i,l,r)
{
if (num[a[i]]>1)
sum-=num[a[i]]*(num[a[i]]-1);
num[a[i]]++;
if (num[a[i]]>1)
sum+=num[a[i]]*(num[a[i]]-1);
}
ans[d[1]]=sum/2;
ans2[d[1]]=r-l+1;
ans2[d[1]]*=(ans2[d[1]]-1);
ans2[d[1]]/=2;
j=gcd(ans[d[1]],ans2[d[1]]);
ans[d[1]]/=j;
ans2[d[1]]/=j;
fo(i,2,m)
{
if (l>b[i])
{
fd(j,l-1,b[i])
{
if (num[a[j]]>1)
sum-=num[a[j]]*(num[a[j]]-1);
num[a[j]]++;
if (num[a[j]]>1)
sum+=num[a[j]]*(num[a[j]]-1);
}
l=b[i];
}
if (r<c[i])
{
fo(j,r+1,c[i])
{
if (num[a[j]]>1)
sum-=num[a[j]]*(num[a[j]]-1);
num[a[j]]++;
if (num[a[j]]>1)
sum+=num[a[j]]*(num[a[j]]-1);
}
r=c[i];
}
if (l<b[i])
{
fo(j,l,b[i]-1)
{
if (num[a[j]]>1)
sum-=num[a[j]]*(num[a[j]]-1);
num[a[j]]--;
if (num[a[j]]>1)
sum+=num[a[j]]*(num[a[j]]-1);
}
l=b[i];
}
if (r>c[i])
{
fd(j,r,c[i]+1)
{
if (num[a[j]]>1)
sum-=num[a[j]]*(num[a[j]]-1);
num[a[j]]--;
if (num[a[j]]>1)
sum+=num[a[j]]*(num[a[j]]-1);
}
r=c[i];
}
ans[d[i]]=sum/2;
ans2[d[i]]=c[i]-b[i]+1;
ans2[d[i]]*=(ans2[d[i]]-1);
ans2[d[i]]/=2;
j=gcd(ans[d[i]],ans2[d[i]]);
ans[d[i]]/=j;
ans2[d[i]]/=j;
}
fo(i,1,m)
printf("%d%c%d\n",ans[i],'/',ans2[i]);
}
JZOJ1942
Description
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令:
1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。
2、 R P Col 把第P支画笔替换为颜色Col。
为了满足墨墨的要求,你知道你需要干什么了吗?