标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others)
Total Submission(s): 654 Accepted Submission(s): 219
#include<bits/stdc++.h> using namespace std; typedef __int64 INT; const int maxn=55000; int a[maxn],s[maxn]; INT cal(INT nn){ if(nn<3) return 0; return (nn-2)*(nn-1)*nn/6; } INT GCD(INT a,INT b){ return b==0?a:GCD(b,a%b); } int main(){ int t,n,m,li,ri; scanf("%d",&t); while(t--){ memset(s,0,sizeof(s)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++){ //差分 scanf("%d%d",&li,&ri); s[li]++;s[ri+1]--; } for(int i=1;i<=n;i++){ //前缀和。s数组中的值就是第i个玩具在多少个区间内。 s[i]+=s[i-1]; } INT fm,fz; fz=0; for(int i=1;i<=n;i++){ fz+=cal((INT)s[i])*a[i]; } if(m<3){ puts("0"); continue; } fm=cal(m); if(fz==0){ printf("0\n",fm); }else { INT gcd=GCD(fz,fm); fz/=gcd,fm/=gcd; if(fm==1) printf("%I64d\n",fz); else printf("%I64d/%I64d\n",fz,fm); } } return 0; }
HDU 5419——Victor and Toys——————【线段树|差分前缀和】
标签:
原文地址:http://www.cnblogs.com/chengsheng/p/4781365.html