中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数。
现在有nn个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数。
Input
多组测试数据
第一行一个数n(n≤8000)n(n≤8000)
第二行nn个数,0≤0≤每个数≤109≤109,
Output
NN个数,依次表示第ii个数在多少包含其的区间中是中位数。
Sample Input
5
1 2 3 4 5
Sample Output
1 2 3 2 1
暴力中位数计数
//坑点 能达到0的都要算上去,能达到0的情况不止开始的一种,有很多种,
//前面如果数量刚好相等,那么为0就是可行的方案 直接加上就好.前面是把第i位包括了进去,
//后面的话就是不包含第i位的,不包含第i位的可行情况 必须和包含第i位的可行情况结合才是一个可行的方案
前面计算的是 小于 -1 大于 +1 后面是反着来即可
#include <bits/stdc++.h>
using namespace std;
const int N = 8010;
int a[N];
int vis[2*N+100];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
int f=0;
memset(vis,0,sizeof(vis));
vis[N]++;
for(int j=i-1;j>=1;j--)
{
if(a[j]>a[i]) f++;
else f--;
vis[N+f]++;
}
int ans=vis[N];//坑点 能达到0的都要算上去,能达到0的情况不止开始的一种,有很多种,
//前面如果数量刚好相等,那么为0就是可行的方案 直接加上就好.前面是把第i位包括了进去,
//后面的话就是不包含第i位的,不包含第i位的可行情况 必须和包含第i位的可行情况结合才是一个可行的方案
int ff=0;
for(int j=i+1;j<=n;j++)
{
if(a[j]<a[i]) ff++;
else ff--;
ans+=vis[N+ff];
}
if(i==1)
printf("%d",ans );
else printf(" %d",ans );
}
printf("\n");
}
}