[bzoj1303]中位数图
由于是排列,因此b一定只出现了一次,找到出现的位置并向左右扩展
考虑如何判定是否满足条件,当且仅当$[左边比b小的数ls]+[右边比b小的数rs]=[左边比b大的数lb]+[右边比b大的数rb]$,暴力枚举+线段树复杂度为$o(n^2logn)$
变形上式,得到$ls-lb=rb-rs$,对两边分别处理后对应方案相乘求和即为答案
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,a[100005],s1[200005],s2[200005]; 4 long long ans; 5 int main(){ 6 scanf("%d%d",&n,&m); 7 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 8 for(int i=1;i<=n;i++) 9 if (a[i]==m){ 10 int t=n; 11 s1[n]=s2[n]=1; 12 for(int j=i-1;j;j--)s1[t+=2*(a[j]<m)-1]++; 13 t=n; 14 for(int j=i+1;j<=n;j++)s2[t+=2*(a[j]>m)-1]++; 15 for(int j=1;j<=2*n;j++)ans+=1LL*s1[j]*s2[j]; 16 printf("%lld",ans); 17 return 0; 18 } 19 }