1 #include<cstdio>
 2 #include<iostream>
 3 #define M 100005
 4 using namespace std;
 5 int a[M],l[2*M],r[2*M],sum[M],n,m,p,ans;
 6 int main()
 7 {
 8     scanf("%d%d",&n,&m);
 9     for(int i=1;i<=n;i++)
10       {
11         scanf("%d",&a[i]);
12         if(a[i]<m)
13           a[i]=-1;
14         if(a[i]==m)
15           {
16             a[i]=0;
17             p=i;
18           }
19         if(a[i]>m)
20           a[i]=1;
21       }
22     l[n]=r[n]=1;
23     for(int i=p-1;i;i--)
24       {
25         sum[i]=sum[i+1]+a[i];
26         l[n+sum[i]]++;
27       }
28     for(int i=p+1;i<=n;i++)
29       {
30         sum[i]=sum[i-1]+a[i];
31         r[n+sum[i]]++;
32       }
33     for(int i=0;i<=2*n;i++)
34       ans+=l[i]*r[2*n-i];
35     printf("%d\n",ans);
36     return 0;
37 }

分别统计出在中位数左边右边比他大X(比他小X)的数有多少种方案,比他小赋值为-1,比他大赋值为1,用前缀和。最后相应的相乘。

posted on 2016-03-06 22:36  xiyuedong  阅读(137)  评论(0编辑  收藏  举报