题目:http://acm.hdu.edu.cn/showproblem.php?pid=5419
分析:分母是C(m,3)。首先题意:三个区间的交集会对分子有贡献,即三个区间都包含元素a则a对分子有贡献。用差分前缀和预处理被几个区间覆盖,第i个对分子的贡献即wi*C(num[i],3)。注意各个变量是int还是longlong,坑死了。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=50005;
int n,m,w[Tmax],num[Tmax];
long long int p,q;
long long int gcd(long long int a,long long int b)
{
return b==0?a:gcd(b,a%b);
}
void work()
{
int i,tmp=0;
long long int Tgcd;
q=(long long int)1*m*(m-1)*(m-2)/6;p=0;
for(i=1;i<=n;i++)
{
tmp+=num[i];
p+=(long long int)1*w[i]*tmp*(tmp-1)*(tmp-2)/6;
}
if(p==0||q==0){
printf("0\n");
return;
}
Tgcd=gcd(p,q);
p/=Tgcd;q/=Tgcd;
if(q==1) printf("%lld\n",p);
else printf("%lld/%lld\n",p,q);
return;
}
int main()
{
int T,i,l,r;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&w[i]),num[i]=0;
for(i=1;i<=m;i++)
{
scanf("%d %d",&l,&r);
num[l]++;
num[r+1]--;
}
work();
}
return 0;
}