题意:给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。

思路:如果我们把比大于k的值变成1,比k小的值变成-1,那么计算从左边到k区间的值,并记录个数,加上为0的个数,再计算从右边到k区间的值,加上相反数的标记个数,如果值为0,再加1,可用map标记;

代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 1000000007

using namespace std;

int a[100005];
map<int,int> ma;

int main()
{
    int n, k;
    int index=-1;
    scanf("%d %d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]==k)
        {
            index=i;
        }
        else if(a[i]>k)
        {
            a[i]=1;
        }
        else if(a[i]<k)
        {
            a[i]=-1;
        }
    }
    ll z=1;
    int l=index-1,r=index+1,ji=0;
    while(l)
    {
        ji=ji+a[l];
        ma[ji]++;
        l--;
    }
    z=z+ma[0];
    ji=0;
    while(r<=n)
    {
        ji=ji+a[r];
        if(ji==0)
        {
            z++;
        }
        z=z+ma[-ji];
        r++;
    }
    cout << z << endl;
    return 0;
}