[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;
}