记录编号 |
397020 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[国家集训队 2010] 小Z的袜子 |
最终得分 |
100 |
用户昵称 |
LadyLex |
是否通过 |
通过 |
代码语言 |
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);
}