zoukankan      html  css  js  c++  java
  • HDU 5701 中位数计数 暴力

    中位数计数

    题目连接:

    http://acm.hdu.edu.cn/showproblem.php?pid=5701

    Description

    中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数。

    现在有n个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数。

    Input

    多组测试数据

    第一行一个数n(n≤8000)

    第二行n个数,0≤每个数≤109,

    Output

    N个数,依次表示第i个数在多少包含其的区间中是中位数。

    Sample Input

    5
    1 2 3 4 5

    Sample Output

    1 2 3 2 1

    Hint

    题意

    题解:

    暴力枚举中位数

    然后比这个数小的,令为-1,比这个数大的,令为+1

    那么只要sigma(num[x]*num[2n-x])就是他的方案数

    这个n^2暴力莽一波就好了

    代码

    #include<queue>
    #include<map>
    #include<stdio.h>
    #include<cstring>
    #include<set>
    #include<vector>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn = 8005;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n;
    int a[maxn];
    int H[maxn],mx;
    int sum[maxn];
    int l[maxn*2],r[maxn*2];
    int tree[maxn];
    vector<int>V;
    int getid(int x)
    {
        return lower_bound(V.begin(),V.end(),x)-V.begin()+1;
    }
    void solve()
    {
        V.clear();
        for(int i=1;i<=n;i++)
            a[i]=read(),V.push_back(a[i]),H[i]=0;
        sort(V.begin(),V.end());
        V.erase(unique(V.begin(),V.end()),V.end());
        for(int i=1;i<=n;i++)a[i]=getid(a[i]);
        memset(H,0,sizeof(H));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(a[j]<a[i])tree[j]=1;
                else if(a[j]==a[i])tree[j]=0;
                else tree[j]=-1;
            }
            memset(l,0,sizeof(l));
            memset(r,0,sizeof(r));
            memset(sum,0,sizeof(sum));
            l[n]=1,r[n]=1;
            for(int j=i-1;j>=1;j--)
            {
                sum[j]=sum[j+1]+tree[j];
                l[sum[j]+n]++;
            }
            for(int j=i+1;j<=n;j++)
            {
                sum[j]=sum[j-1]+tree[j];
                r[sum[j]+n]++;
            }
            for(int j=0;j<=2*n-1;j++)
                H[i]+=l[j]*r[2*n-j];
        }
        printf("%d",H[1]);
        for(int i=2;i<=n;i++)
            printf(" %d",H[i]);
        printf("
    ");
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
            solve();
    }
  • 相关阅读:
    Java 学习笔记之 线程interrupted方法
    Java 学习笔记之 线程interrupt方法
    定义函数
    调用函数
    pass语句
    循环
    条件语句
    别样赋值
    import语句
    字典方法
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5522564.html
Copyright © 2011-2022 走看看