思路
首先找到这个数字 , 然后以这个数字为轴, 左右尝试扩展区间
方便起见, 可以把这个数字设置为 0 ,比他大的设置为1 , 比他小的设置成-1
(自己比较也一样的)
然后就可以以这个点为中心, 开始左右区间进行枚举
[-------left------------b-------------right---------------]
一开始枚举左边区间, 统计比他大的数字1和比他小的数字-1, 如果一样, 则增加这个区间ans ++
同理可以枚举右边区间,和左边区间一样的思路
然后是左右区间, 要枚举左边的和右边的 统计1 和 -1的数字一样
这里需要用一个数组记录一下, val[ left - n - right] 记录1的个数和-1的个数的差值的个数
如果 val[n-x] == val [n + x ] 那么也记录这个区间在内
上述过程可以合并一下
ac 代码
#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
int a[N] , val[N<<1];
int main()
{
int n , b ;
cin >> n >> b;
int pos;
for(int i = 1 ;i<=n;i++)
{
int x ; cin >> x;
if (x > b) a[i] = 1;
else if (x < b) a[i] = -1;
else pos = i;
}
int sm = 0;
int ans = 0 ;
for(int i = pos - 1; 1<=i; i--)
{
sm += a[i];
val [n - sm]++ ;
if (sm == 0) ans ++;
}
sm = 0;
for (int i = pos + 1; i <= n ;i++)
{
sm +=a[i];
ans += val [n+sm] ; // 和 左边配对的情况
if (sm == 0) ans ++ ; // 右边单独配对的情况
}
cout << ans + 1 ; // 自己单独也算一种情况
return 0;
}