题意:
中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数。
现在有n个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数
思路:
对于一个数如果他在这样一组区间里,就是说比他大的数等于比他小的数那么我们就可以说这个数是这个区间的中位数,根据这个思路我们可以记录一下当前枚举向左的时候比他大的数字和比他小的数字的差值,如果在我们向右枚举的时候有遇到比他小的数字和比他大数字的差值在向左枚举的时候出现过那么就加一个就好了
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 8000+10;
int a[maxn];
int cnt ,vis[maxn*2];
int main()
{
int n;
cin>>n;
for(int i = 1 ; i <= n ; i++)
{
cin>>a[i];
}
for(int i = 1 ; i <= n ; i++)
{
cnt = 0;
int ans = 0 ;
memset(vis,0,sizeof(vis));
for(int j = i ; j <= n ;j++)
{
if(a[i] > a[j]){
++cnt;
}
else
{
--cnt;
}
vis[maxn + cnt]++;
// printf("%d : %d \n",i,cnt);
}
cnt = 0;
for(int j = i ; j >= 1 ; j--)
{
if(a[i] < a[j])
{
++cnt;
}
else
{
--cnt;
}
ans+=vis[maxn + cnt];
// printf("%d : %d\n",i,cnt);
}
cout<<ans<<" ";
}
}