给出一些数字,要求连续几个数的平均数大于所给的数,问你最后有几种情况...
首先一个比较好的解决办法就是,把每个输入的数减去所给的数,然后问题转换为,求连续数的和大于0即可
运用循环枚举的话,O(n^2),超时是肯定的,所以可以想到此问题类似与求逆序对的问题,不过此题是正序对,稍作改动即可
直接搬上求逆序对的模版吧
#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])//如果改成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;
}