给出一个序列,然后让你求连续序列和的平均数大于所给的数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;
}

浙公网安备 33010602011771号