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,用前缀和。最后相应的相乘。
原文:http://www.cnblogs.com/xydddd/p/5248894.html