[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 }