中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数。
现在有nn个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数。
思路:对于每个数,先往右扫一遍,求得其右边比其大的和比其小的数的个数的差x,然后再往左扫一遍,求其左边比起小的数和比起大的数的差,若一个数在这个区间为中位数,则若其右边比它大的比比它小的多x,则其左边相反小的要比大的多x,这样x才能正好在中间位置
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define read(x) scanf("%d",&x)
using namespace std;
typedef long long LL;
const int maxn=8000;
int n,t[maxn*2+100];
int a[maxn+100];
int main() {
int n;
while(read(n) != EOF) {
memset(t,0,sizeof(t));
for(int i=1;i<=n;i++) {
read(a[i]);
}
for(int i=1;i<=n;i++) {
int ans=0,cnt=0;
memset(t,0,sizeof(t));
t[maxn]++;
for(int j=i+1;j<=n;j++) {
cnt+=a[j]>a[i]?1:-1;
t[maxn+cnt]++;
}
cnt=0;
ans+=t[maxn];
for(int j=i-1;j>=1;j--) {
cnt+=a[j]<a[i]?1:-1;
ans+=t[maxn+cnt];
}
if(i==1) {
printf("%d",ans);
}
else printf(" %d",ans);
}
puts("");
}
}