这题最主要的思想就是建模,对于每一个数a[i],建立一个c数组:
- 若a[i]<b,则c[i]=-1。
- 若a[i]=b,则c[i]=0,用一个变量wz记录当前的i。
- 若a[i]>b,则c[i]=1。
之后我们再对c数组做一遍前缀和,然后枚举两个位置i和j,设i<j,若c[i]=c[j],则答案+1。
因此,我们设k=0->wz-1,统计每个c[k]的出现次数,然后再设k=wz->n,ans+=c[k]出现的次数。
最后的ans就是答案咯。
注意:为了防止c[k]为下标时c[k]<0,不符合C++语言,因此我们可以把c[k]+=n。
附上AC代码:
#include <cstdio>
using namespace std;
int n,m,x,c[100010],t[200010],ans,wz;
int main(void){
scanf("%d%d",&n,&m);
for (int i=1; i<=n; ++i){
scanf("%d",&x);
if (x<m) c[i]=-1;
if (x==m) c[i]=0,wz=i;
if (x>m) c[i]=1;
c[i]+=c[i-1];
}
for (int i=0; i<wz; ++i) ++t[c[i]+n];
for (int i=wz; i<=n; ++i) ans+=t[c[i]+n];
printf("%d",ans);
return 0;
}