在求逆序对的时候用了分块QAQ
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int b[N],id[N],be[N],f[N],g[N],n,m,d,k=1;
long long ans;
struct node
{
int v,p; //v:值,p:离散化前的位置
}a[N];
bool cmp1(node x,node y)
{
return x.v<y.v;
}
bool cmp2(node x,node y)
{
return x.p<y.p;
}
int main()
{
int i,j;
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m,n++,d=sqrt(n);
for(i=1;i<n;i++)
cin>>b[i],b[i]+=b[i-1]-m; //前缀和
a[n].p=n,id[n]=(n-1)/d+1;
for(i=n-1;i>=1;i--)
a[i].v=b[n-i],a[i].p=i,id[i]=(i-1)/d+1;
for(i=1;i<=id[n];i++)
be[i]=(i-1)*d+1;
sort(a+1,a+n+1,cmp1);
for(i=1;i<=n;i++) //离散化
{
while(a[i].v==a[i+1].v)
a[i++].v=k;
a[i].v=k++;
}
sort(a+1,a+n+1,cmp2);
for(i=1;i<=n;i++) //分块统计
{
k=id[a[i].v];
ans+=f[a[i].v]+g[k];
for(j=be[k];j<=a[i].v;j++)
f[j]++;
for(j=1;j<k;j++)
g[j]++;
}
cout<<ans<<'\n';
return 0;
}