解题思路

符合题意的序列:包含 b 的连续子序列,且序列中大于 b 的值的数目与小于 b 的值的数目相等。

使用 map 记录 b 值所在位置 pos 左边的每个连续子序列中,大于 b 值的数目与小于 b 值的数目之差 tmp 的个数,小于 b 减 1,大于 b 加 1。
当两者数目相等时,tmp = 0,序列符合。
遍历 pos 右边子序列,将与当前差值相反的数目累加计入结果。

C++代码

#include<iostream>
#include<map>
using namespace std;

int main(){
    int n, b;
    cin >> n >> b;
    int arr[n];
    int pos = 0;
    for(int i=0; i<n; ++i){
        cin >> arr[i];
        if(arr[i] == b)
            pos = i;    // 记录b的位置
    }

    int ans = 1;    // b本身就符合题意
    map<int, int> mp;
    int tmp = 0;
    for(int i=pos-1; i>=0; --i){
        if(arr[i] < b)
            --tmp;
        else
            ++tmp;

        mp[tmp] += 1;
        if(tmp == 0)
            ++ans;
    }

    tmp = 0;
    for(int i=pos+1; i<n; ++i){
        if(arr[i] < b)
            --tmp;
        else
            ++tmp;

        if(tmp == 0)
            ++ans;
        ans += mp[-tmp];
    }

    cout << ans << endl;
    return 0;
}