Seq
mean(A[l…r])>=P当且仅当sum[r]-sum[l-1]-(r-l+1)P>=0即(sum[r]-rP)-(sum[l-1]-(l-1)P)>=0。令 B[i]=sum[i]-iP ,即为求 B[r]>=Bl,即求B的逆序对个数。
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
int n,p,a[1000002],d[1000002],v;
void dfs(int *a, int l, int r)
{
if (r-l==0 || r-l==1) return;
int m=(l+r)/2;
dfs(a,l,m);
dfs(a,m,r);
int ll=l,rr=m,zz=l;
while (zz<r)
if ((r==rr) || (ll!=m && a[rr]>=a[ll]))
{
d[zz++]=a[ll++];
v+=(r-rr);
}
else d[zz++]=a[rr++];
for (int i=l; i<r; i++) a[i]=d[i];
return;
}
signed main()
{
cin>>n;
for (int i=1; i<=n; i++) cin>>a[i];
cin>>p;
for (int i=1; i<=n; i++) a[i]+=a[i-1]-p;
dfs(a,0,n+1);
cout<<v<<endl;
return 0;
}