洛谷——P1627 [CQOI2009]中位数

P1627 [CQOI2009]中位数

给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。

 

中位数的题目有关统计的话,可以转化成$0,-1,1$这三个数来做,分别表示这个数$=x$,$<x$和$>x$

这个题也就是要求统计$x$左边和右边相同的$s$的对数,$s$表示前缀和之差

 

基数排序

#include<bits/stdc++.h>

using namespace std;

int n,x;
long long ans,c[2][200005];

int main() {
    scanf("%d%d",&n,&x);
    int flg=0;
    c[0][n]=1;
    for(int s=n,p,i=1; i<=n; i++) {
        scanf("%d",&p);
        if(x==p) flg=1;
        else s+=p>x?1:-1;
        c[flg][s]++;
    }
    for(int i=0; i<=n*2; i++)
        ans+=c[0][i]*c[1][i];
//        cout<<c[0][i]<<" "<<c[1][i]<<"\n";

    printf("%lld\n",ans);

    return 0;
}

 

posted @ 2018-10-22 19:20  清风我已逝  阅读(183)  评论(0编辑  收藏  举报