一个大于b的数和一个小于b的数可以互相抵消,所以我们用1和-1表示。
从b向两边扩展,left[i]表示b左边抵消后有i个数比b小的可能数,right[i]表示b右边抵消后有i个数比b大的可能数。
乘法原理得ans=sigma(left[i]*right[i]).
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
using namespace std;
const int N=100005;
int n,m,ad,data[N*2],r[N*2],l[N*2],sum,ans;
int main(){
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>data[i];
if (data[i]==m) ad=i;
}
sum=0;l[N]=r[N]=1;
for (int i=ad-1;i;i--)
sum+=(data[i]<m)?1:-1,
l[sum+N]++;
sum=0;
for (int i=ad+1;i<=n;i++)
sum+=(data[i]>m)?1:-1,
r[sum+N]++;
for (int i=N-n;i<=N+n;i++)
ans+=r[i]*l[i];
cout<<ans<<endl;
return 0;
}