记录编号 397020 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2010] 小Z的袜子 最终得分 100
用户昵称 GravatarLadyLex 是否通过 通过
代码语言 C++ 运行时间 1.552 s
提交时间 2017-04-19 16:36:30 内存使用 2.97 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
struct node
{
	LL le,ri,num;
	LL mu,zi;
}s[50110];int n,m,len,l,r;
int c[50110],be[50110];
LL ge[50110];
bool mt(const node &a,const node &b)
{
	if(be[a.le]!=be[b.le])
		return be[a.le]<be[b.le];
	return a.ri<b.ri;
}
LL gcd(LL a,LL b){/*if(a<b){LL t=a;a=b;b=t;}*/return b==0?a:gcd(b,a%b);}
bool mp(const node &a,const node &b){return a.num<b.num;}
int main()
{
	freopen("hose.in","r",stdin); 
	freopen("hose.out","w",stdout); 
	//freopen("FAL.txt","r",stdin); 
	scanf("%d%d",&n,&m);
	len=(int)sqrt(n);
	for(int i=1;i<=n;i++)
		scanf("%d",&c[i]),be[i]=(i-1)/len+1;
	for(int i=1;i<=m;i++)
		scanf("%lld%lld",&s[i].le,&s[i].ri),s[i].num=i;
	sort(s+1,s+m+1,mt);
					 // r  l(一开始什么都不能有)   
	l=1,r=0;LL ans=0;//   [1][2][3][4][5][6][7][8][9][10][][][][][]
					 //         le        ri
					 //       l     l' r'       r
	for(int i=1;i<=m;i++)
	{
		s[i].mu=(s[i].ri-s[i].le+1)*(s[i].ri-s[i].le);//分母为总个数(Cn2) 
		if(r<s[i].ri)
			for(int j=r+1;j<=s[i].ri;j++)
				ans+=((ge[c[j]]<<1)+1),ge[c[j]]++;	
		if(r>s[i].ri)
			for(int j=r;j>s[i].ri;j--)
				ans-=((ge[c[j]]<<1)-1),ge[c[j]]--;	
		if(l>s[i].le)
			for(int j=l-1;j>=s[i].le;j--)
				ans+=((ge[c[j]]<<1)+1),ge[c[j]]++;
		if(l<s[i].le)
			for(int j=l;j<s[i].le;j++)
				ans-=((ge[c[j]]<<1)-1),ge[c[j]]--;	
		s[i].zi=ans-(s[i].ri-s[i].le+1);
		l=s[i].le,r=s[i].ri;
	}
	//while(1);
	sort(s+1,s+m+1,mp);
	//while(1);
	for(int i=1;i<=m;i++)
	{
		//printf("lol");
		if(!s[i].zi){printf("0/1\n");continue;}
		//printf("lol");
		LL d=gcd(s[i].mu,s[i].zi);
		//printf("lol");
		//printf("%lld\n",d);
		printf("%lld/%lld\n",s[i].zi/d,s[i].mu/d);
	}
	//while(1);
}