[bzoj1303]中位数图

前缀和+差分 一段区间内的t数组和=0  <=>  b为这一段区间的中位数

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 using namespace std;
 7 
 8 const int N=200000; 
 9 int a[N],n,b,p,t[N],l[N],r[N],ans;
10 
11 int main(){
12     scanf("%d%d",&n,&b);
13     for(int i=1;i<=n;i++){
14         scanf("%d",&a[i]);
15         if(a[i]==b)p=i;
16         if(a[i]>b)t[i]=1;
17         if(a[i]<b)t[i]=-1;
18         t[i]+=t[i-1];
19     }
20     for(int i=0;i<p;i++)l[t[i]+n]++;
21     for(int i=p;i<=n;i++)r[t[i]+n]++;
22     for(int i=0;i<=2*n;i++)ans+=l[i]*r[i];
23     printf("%d\n",ans);
24 }
View Code

 

posted @ 2017-01-30 10:53  KingSann  阅读(125)  评论(0)    收藏  举报