[CQOI2009] 中位数

[CQOI2009] 中位数

BZOJ
luogu
考虑(n^2)的暴力怎么写,对每个点记前缀和f,g表示1~i大于和小于b的个数,
枚举左右端点(区间要包含b所在的点),查询这段区间内大于b和小于b的个数,相等就计入答案
写完暴力正解就出来了
考虑只枚举左端点,我们要求有多少右端点满足条件
暴力的式子(f[r]-f[l-1]=g[r]-g[l-1]),那么直接开桶记录每个点的f-g,直接查就好了

#include<bits/stdc++.h>
using namespace std;
const int _=2e5+5;
int re(){
    int x=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*w;
}
int n,k,b,f[_],g[_],t[_];
long long ans;
int main(){
    n=re(),b=re();
    for(int i=1,a;i<=n;i++){
        a=re();f[i]=f[i-1];g[i]=g[i-1];
        if(a>b)f[i]++;
        else if(a<b)g[i]++;
        else k=i;
    }
    for(int i=k;i<=n;i++)t[g[i]-f[i]+n]++;
    for(int i=0;i<k;i++)ans+=t[g[i]-f[i]+n];
    printf("%lld
",ans);return 0;
}
原文地址:https://www.cnblogs.com/sdzwyq/p/9852741.html