记录编号 191786 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2010] 小Z的袜子 最终得分 100
用户昵称 Gravatar/k 是否通过 通过
代码语言 C++ 运行时间 2.610 s
提交时间 2015-10-08 20:58:24 内存使用 2.00 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
int n,m;
struct u
{
	int d;
	int z;
	int y;
}c[50000+10];
int a[50000+10];
int fk[50000+10];
int cl[50000+10];
long long fz[50000+10],fm[50000+10],pr;
bool g(const u & aa,const u & bb)
{
	if(fk[aa.z]==fk[bb.z])
	    return aa.y<bb.y;
	return aa.z<bb.z;
}
inline void gx(int ys,int s)
{
	ys=a[ys];
	pr-=(ll)(cl[ys]-1)*cl[ys];
	cl[ys]+=s;
	pr+=(ll)(cl[ys]-1)*cl[ys];
}
ll gcd(ll a,ll b)
{
	while(b!=0)
	{
		int o=b;
		b=a%b;
		a=o;
	}
	return a;
}
int main()
{
	freopen("hose.in","r",stdin);
	freopen("hose.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	    scanf("%d",&a[i]);
	int blocks=550;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&c[i].z,&c[i].y);
		fk[i]=(i-1)/blocks+1;
		c[i].d=i;
	}
	sort(c+1,c+1+m,g);
	int z=c[1].z,y=c[1].y;
	for(int i=z;i<=y;i++)
	{
		gx(i,1);
	}
	if(c[1].z==c[1].y)
	{
		fz[c[1].d]=0;
		fm[c[1].d]=1;
	}
	else
	{
		fz[c[1].d]=pr;
		fm[c[1].d]=(ll)(c[1].y-c[1].z)*(c[1].y-c[1].z+1);
	}
	for(int i=2;i<=m;i++)
	{
		if(c[i].z==c[i].y)
		{
			fz[c[i].d]=0;
			fm[c[i].d]=1;
			continue;
		}
		while(z<c[i].z)
		{
			gx(z,-1);
			z++;
		}
		while(z>c[i].z)
		{
			z--;
			gx(z,1);
		}
		while(y>c[i].y)
		{
			gx(y,-1);
			y--;
		}
		while(y<c[i].y)
		{
			y++;
			gx(y,1);
		}
		{
			fz[c[i].d]=(ll)pr;
			fm[c[i].d]=(ll)(c[i].y-c[i].z)*(c[i].y-c[i].z+1);
		}
	}
	for(int i=1;i<=m;i++)
	{
		//printf("%d %d %d\n",i,fz[i],fm[i]);
		if(fz[i]==0)
		    printf("0/1\n");
		else
		{
			ll p=gcd(fm[i],fz[i]);
			fz[i]/=p;
			fm[i]/=p;
			printf("%lld/%lld\n",fz[i],fm[i]);
		}
	}
	/*getchar();
	getchar();*/
}