Steven_MengのBlog

传送门
大概就是运用判断中位数的套路吧。
把大于$b$的数设为$1$,等于的设为$0$,小于的设为$-1$。
若一个数列经过这样处理后和为$0$,说明$d$为该数列的中位数。
从中位数的位置分别向左向右求前缀和,放进一个桶里面。
最后乘法原理统计答案。

本蒟蒻还被边界孙了甚久。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
#define MAXN 100005
using namespace std;
int l[MAXN],r[MAXN],p[MAXN];
int bl[MAXN<<1],br[MAXN<<1];
inline int read(){
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9'){
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^'0');
ch=getchar();
}
return x*f;
}
int main(){
int n=read(),b=read();
int pos=0;
for (register int i=1;i<=n;++i){
p[i]=read();if (p[i]==b) pos=i;
p[i]=(p[i]>=b)?(p[i]>b?1:0):-1;
}
for (register int i=pos-1;i>=0;--i){
l[i]=l[i+1]+p[i];
bl[l[i]+MAXN]++;
}
int ans=0;
for (register int i=pos+1;i<=n;++i){
r[i]=r[i-1]+p[i];
ans+=bl[-r[i]+MAXN];
}
printf("%d\n",ans);
}

 评论