版权声明:欢迎转载(标记出处),写得不好还请多指教 https://blog.csdn.net/quan_tum/article/details/82985949
把中位数出现的位置设为 ,比中位数大的设为 ,小的设为 。 表示 到 的和, 表示 左边和为 出现的次数, 同理,如果 则 .
#include<cstdio>
int b,n,p,x,ans,a[400005],s[200005],l[400005],r[400005];
int main(){
scanf("%d%d",&n,&b);
for(int i=1;i<=n;++i) scanf("%d",&x),x==b?p=i,a[i]=0:a[i]=x>b?1:-1;
l[n]=r[n]=1;
for(int i=p-1;i>=1;--i) s[i]=s[i+1]+a[i],++l[s[i]+n];
for(int i=p+1;i<=n;++i) s[i]=s[i-1]+a[i],++r[s[i]+n];
for(int i=0;i<2*n;++i) ans+=l[i]*r[n-i+n];
return !printf("%d",ans);
}