解题思路
比d大的数记为1,小的记为-1,求前缀和。若某一位前缀和为x时,它之前有多少同为x的位置,答案就加几。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstdlib>
using namespace std;
int sz[100005],sf[100005];
int s[100005];
int n,k,wi,ld=0,ans;
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
if(s[i]==k) wi=i;
}
sz[0]=1;
for(int i=wi+1;i<=n;i++){
if(s[i]>k) ld++;
else ld--;
if(ld>=0) sz[ld]++;
else sf[abs(ld)]++;
}
ld=0;ans=sz[0];
for(int i=wi-1;i>=1;i--){
if(s[i]>k) ld++;
else ld--;
if(ld<=0) ans+=sz[abs(ld)];
else ans+=sf[ld];
}
printf("%d",ans);
return 0;
}