BestCoder#52 Victor and Toys

来源:互联网 发布:开80端口 编辑:程序博客网 时间:2024/05/18 02:47

题目: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;}
0 0
原创粉丝点击