51nod 1682 中位数计数

来源:互联网 发布:android sdk mac 下载 编辑:程序博客网 时间:2024/05/18 02:52

一看数据,O(n^2)可过
我是先向右找,边找边统计有多少个区间能够使当前位数字为中位数,同时记录在每个区间 比当前数字小的数的个数-比当前数字大的数的个数 所得到值的个数。统计完后继续向左统计,统计有多少个区间符合条件,然后同时加上 比当前数字大的数的个数-比当前数字小的数的个数 所得值的个数。
假设当前数字为x,如果左边lt个数字 > x,rt个数字 < x , 右边 zz个数字 > x,yy个数字 < x,若lt-rt=yy-zz,则这个区间当前数字是中位数。

#include <bits/stdc++.h>using namespace std;const int MAXN = 8e3+10;const int M = 8e3+2;int num[MAXN];int mark[MAXN*2];int n;int calc(int index){    memset(mark,0,sizeof(mark));    int f = index+1,b = index-1;    int lt = 0,rt = 0;    int ret = 1;    for(int i = f; i < n; ++i)    {        if(num[i] < num[index])            ++lt;        else            ++rt;        if(lt == rt)        {            ++ret;            mark[M]++;        }        else            mark[lt-rt+M]++;    }    lt = rt = 0;    for(int i = b; i >= 0; --i)    {        if(num[i] < num[index])            ++lt;        else            ++rt;        if(lt == rt)            ret += 1+mark[M];        else            ret += mark[rt-lt+M];    }    return ret;}int main(){    scanf("%d",&n);    for(int i = 0; i < n; ++i)        scanf("%d",&num[i]);    for(int i = 0; i < n; ++i)        printf("%d ",calc(i));    return 0;}
原创粉丝点击