中位数计数
Time Limit : 12000/6000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other)
Total Submission(s) : 11 Accepted Submission(s) : 5
Problem Description
中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数。
现在有$n$个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数。
Input
多组测试数据 第一行一个数$n(n\leq 8000)$ 第二行$n$个数,$0\leq $每个数$\leq 10^{9}$,
Output
$N$个数,依次表示第$i$个数在多少包含其的区间中是中位数。
Sample Input
5 1 2 3 4 5
Sample Output
1 2 3 2 1
Source
2016"百度之星" - 初赛(Astar Round2B)
题解:
给出一个n,以下是n个数,计算每个数是中位数的可能情况,前提是每个数的位置不变。
例如:1 2 3 4 5
当i=3时,向右遍历,遇到比它大的加一,遇到比它小的减一,a[4]>a[3],则s[p+1]=1,a[5]>a[3],则s[p+2]=1;
向左遍历,a[2]<a[3],遇到比它小的加一,遇到比它大的减一,则s[p+1]=1,所以,sum+1,a[1]<a[3],则s[p+2]=1,所以sum+1+1;
#include<cstdio>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int const MAX=8005;
int const p=8000;
int a[MAX],s[8005*2];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
int sum=0,ans=0;
memset(s,0,sizeof(s));
s[p]++;
for(int j=i+1;j<=n;j++)
{
if(a[j]>a[i])
ans+=1;
else
ans+=-1;
s[p+ans]++;
}
ans=0;
sum+=s[p];
for(int j=i-1;j>=1;j--)
{
if(a[j]<a[i])
ans+=1;
else
ans+=-1;
sum+=s[p+ans];
}
printf("%d",sum);
if(i==n)
printf("\n");
else
printf(" ");
}
}
return 0;
}