分母是一定的C(m,3) 树状数组求每一个数能够在那些段中出现,若x出如今了s段中,分子加上w[x]*C(s,3)
Victor and Toys
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others)Total Submission(s): 331 Accepted Submission(s): 118
Problem Description
Victor has n toys,
numbered from 1 to n .
The beauty of the i -th
toy is wi .
Victor has a sense of math and he generatesm intervals,
the i -th
interval is [li,ri] .
He randomly picks 3 numbers i,j,k(1≤i<j<k≤m) ,
and selects all of the toys whose number are no less than max(li,lj,lk) and
no larger than min(ri,rj,rk) .
Now he wants to know the expected sum of beauty of the selected toys, can you help him?
Victor has a sense of math and he generates
Input
The first line of the input contains an integer T ,
denoting the number of test cases.
In every test case, there are two integersn and m in
the first line, denoting the number of the toys and intervals.
The second line containsn integers,
the i -th
integer wi denotes
that the beauty of the i -th
toy.
Then there arem lines,
the i -th
line contains two integers li and ri .
1≤T≤10 .
1≤n,m≤50000 .
1≤wi≤5 .
1≤li≤ri≤n .
In every test case, there are two integers
The second line contains
Then there are
Output
Your program should print T lines
: the i -th
of these denotes the answer of the i -th
case.
If the answer is an integer, just print a single interger, otherwise print an irreducible fraction likep/q .
If the answer is an integer, just print a single interger, otherwise print an irreducible fraction like
Sample Input
1 3 4 1 1 5 2 3 1 3 3 3 1 1
Sample Output
5/4
Source
/* *********************************************** Author :CKboss Created Time :2015年08月23日 星期日 14时23分47秒 File Name :HDOJ5419.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; typedef unsigned long long int LL; const int maxn=50500; /****************BIT***********************/ int n,m; int w[maxn]; int l[maxn],r[maxn]; inline int lowbit(int x) { return x&(-x); } int tree[maxn]; void add(int p,int v) { for(int i=p;i<maxn;i+=lowbit(i)) tree[i]+=v; } int sum(int p) { int ret=0; for(int i=p;i;i-=lowbit(i)) ret+=tree[i]; return ret; } LL getC(LL x) { return x*(x-1)/2LL*(x-2)/3LL; } LL gcd(LL a,LL b) { if(b==0) return a; return gcd(b,a%b); } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T_T; scanf("%d",&T_T); while(T_T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",w+i); memset(tree,0,sizeof(tree)); for(int i=0;i<m;i++) { scanf("%d%d",l+i,r+i); add(l[i],1); add(r[i]+1,-1); } if(m<3) { puts("0"); continue; } LL up=0,down=getC(m); for(int i=1;i<=n;i++) { LL x=sum(i); if(x>=3) { up=up+w[i]*getC(x); } } if(up==0) { puts("0"); continue; } LL g=gcd(up,down); if(g==down) cout<<up/g<<endl; else cout<<up/g<<"/"<<down/g<<endl; } return 0; }