洛谷——P1627 [CQOI2009]中位數

P1627 [CQOI2009]中位數

給出1~n的一個排列,統計該排列有多少個長度爲奇數的連續子序列的中位數是b。中位數是指把全部元素從小到大排列後,位於中間的數。c++

 

中位數的題目有關統計的話,能夠轉化成$0,-1,1$這三個數來作,分別表示這個數$=x$,$<x$和$>x$spa

這個題也就是要求統計$x$左邊和右邊相同的$s$的對數,$s$表示前綴和之差code

 

基數排序blog

#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;
}
相關文章
相關標籤/搜索