题意
题解
中位数为 b b b 的连续子序列,由于数组为 1 − n 1-n 1−n 的排列,故子序列中 x ( x < b ) x(x<b) x(x<b) 与 y ( y > b ) y(y>b) y(y>b) 的数量相等。
s ′ [ i ] = { 1 s [ i ] > b 0 s [ i ] = b − 1 s [ i ] < b s'[i]=\begin{cases} 1 & s[i]>b\\ 0 & s[i]=b\\ -1 & s[i]<b\\ \end{cases} s′[i]=⎩⎪⎨⎪⎧10−1s[i]>bs[i]=bs[i]<b
设 b b b 索引为 i i i,维护其左右区间的前缀和,统计满足 [ l , r ] ( l ∈ [ 0 , i ] , r ∈ [ i , n ) [l,r](l\in [0,i],r\in [i,n) [l,r](l∈[0,i],r∈[i,n) 的区间和为 0 0 0 的区间数即可。
#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
int n, b, s[maxn], f[maxn];
int main()
{
scanf("%d%d", &n, &b);
int p, sum = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", s + i);
if (s[i] == b)
{
p = i, s[i] = 0;
continue;
}
s[i] = (s[i] > b ? 1 : -1);
}
for (int i = p; i >= 0; i--)
{
sum += s[i];
f[n + sum]++;
}
long long res = 0;
sum = 0;
for (int i = p; i < n; i++)
{
sum += s[i];
res += f[n - sum];
}
printf("%lld", res);
return 0;
}