题意:给出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;
}

京公网安备 11010502036488号