题目描述
/* 求区间i(1<=i<=n)到j(i<=j<=n)的平均值大于k的区间个数 可以先对每个数减去k,再对新得到的数组求前缀和 如果sum[j]-sum[i-1]>=0,说明i到j区间的数的平均值大于等于k 移向得sum[j]>=sum[i-1],因为j>=i,所以j>i-1 也就是对sum求顺序对数了 */ #include#include using namespace std; const int N=1e5+7; int n,k; long long ans; int a[N],tmp[N]; int qread() { int x=0; char ch=getchar(); while(ch<'0' || ch>'9')ch=getchar(); while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} return x; } void Msort(int l,int r) { if(l>=r)return; int mid=l+r>>1; Msort(l,mid);Msort(mid+1,r); int i=l,j=mid+1,cnt=0; while(i<=mid && j<=r) if(a[i]<=a[j]) { tmp[++cnt]=a[i++]; ans+=r-j+1; } else tmp[++cnt]=a[j++]; while(i<=mid)tmp[++cnt]=a[i++]; while(j<=r)tmp[++cnt]=a[j++]; for(int i=1;i<=cnt;i++) a[i+l-1]=tmp[i]; } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) a[i]=qread()-k+a[i-1]; Msort(0,n); printf("%lld\n",ans); return 0; }