解题思路
符合题意的序列:包含 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;
} 
京公网安备 11010502036488号