给出一个序列,然后让你求连续序列和的平均数大于所给的数a
可以先把输入的数减去a,那么就是求连续序列的和大于0即可,接下来把数组suni]就是前i项的和,那么s[j]>s[i]就可以满足
因此就是求sum的逆序数,可以用归并排序来求,直接上代码慢慢看吧.
/*Source Code Problem: 1285 Username: void Run Time: 233MS Memory: 1484K Language:C++ JudgeStatus: Accepted */ #include<iostream> #include<cstdio> #include<memory.h> #include<stdio.h> using namespace std; const int MAX=100005; int s[MAX],h[MAX]; int n,a; long long ans; void merge(int l,int m,int r) { int i=l,j=m+1,k=l; while(i<=m&&j<=r) { if(s[i]<s[j]) { ans+=r-j+1; h[k++]=s[i++]; } else { h[k++]=s[j++]; } } while(i<=m) h[k++]=s[i++]; while(j<=r) h[k++]=s[j++]; for(i=l;i<=r;i++) s[i]=h[i]; } void mergesort(int l,int r) { int m=(l+r)/2; if(l<r) { mergesort(l,m); mergesort(m+1,r); merge(l,m,r); } } int main() { int i,j,T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&a); s[0]=0; ans=0; for(i=1;i<=n;i++) { scanf("%d",&j); j-=a; s[i]=s[i-1]+j; } mergesort(0,n); printf("%lld\n",ans); } return 0; }