1. 程式人生 > >hdu 中位數計數

hdu 中位數計數

                                            中位數計數

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;
}