BZOJ1303_中位数图_KEY

题目传送门

较水,开两个桶即可。

题目可以理解为,将大于B的数看为1,小于B的数看为-1,将以B这个数为中位数的序列左右分为两半,加起来为0.

code:

#include <cstdio>
using namespace std;

char tc()
{
    static char fl[10000000],*A=fl,*B=fl;
    return A==B&&(B=(A=fl)+fread(fl,1,10000000,stdin),A==B)?EOF:*A++;    
}

int read()
{
    char c;while(c=tc(),c<'0'||c>'9');int x=c-'0';
    while(c=tc(),c>='0'&&c<='9')x=x*10+c-'0';
    return x;
}

int N,B,x,sum,t1[200005],t2[200005],P,num[100005];
int main()
{
    N=read(),B=read();
    long long ans=0;
        for(int i=1;i<=N;i++){
            x=read();
            if(x>B)num[i]=1;
            if(x==B)P=i;
            if(x<B)num[i]=-1;
        }
    t1[N]=1,t2[N]=1; 
        for(int i=P-1;i>0;i--){
            sum=sum+num[i];
            t1[sum+N]++;
        }sum=0;
        for(int i=P+1;i<=N;i++){
            sum=sum+num[i];
            t2[sum+N]++;
        }
        for(int i=0;i<2*N;i++)ans+=t1[i]*t2[2*N-i];
    printf("%lld",ans);
    return 0;
}
posted @ 2017-12-20 20:36  Cptraser  阅读(174)  评论(0编辑  收藏  举报