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; }