BZOJ 1303 [CQOI2009]中位数图

题解:

从s向两端维护大于b的数和小于b的数即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int maxn=100009;

int n,b,s;
int a[maxn];
map<int,int>ma;
long long ans=0;

int main(){
    scanf("%d%d",&n,&b);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        if(a[i]==b)s=i;
    }
    ma[0]=1;
    int cnt=0;
    for(int i=s+1;i<=n;++i){
        if(a[i]>b)++cnt;
        else --cnt;
        ma[cnt]++;
    }
    cnt=0;
    ans+=ma[0];
    for(int i=s-1;i>=1;--i){
        if(a[i]>b)++cnt;
        else --cnt;
        ans+=ma[-cnt];
    }
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2018-03-20 15:47  ws_zzy  阅读(100)  评论(0编辑  收藏  举报