题目描述
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。
输入描述:
第一行为两个正整数n和b ,第二行为1~n 的排列。
输出描述:
输出一个整数,即中位数为b的连续子序列个数。
示例1
输入
7 4 5 7 2 4 3 1 6
7 4 5 7 2 4 3 1 6
输出
4
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,b;
int pos;
int a[1<<17];
int m[1<<17],f[1<<17];
signed main(){
cin>>n>>b;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==b) a[i]=0,pos=i;
else if(a[i]>b) a[i]=1;
else a[i]=-1;
}
int ans=0;
for(int i=pos-1;i;i--){
ans+=a[i];
if(ans>0) m[ans]++;
else f[-ans]++;
}
int cnt=f[0]+1;
f[0]++;
ans=0;
for(int i=pos+1;i<=n;i++){
ans+=a[i];
if(ans>=0) cnt+=f[ans];
else cnt+=m[-ans];
}
if(b>n) cout<<0;
else cout<<cnt;
}
思路:将大于中位数的数字 初始化为1 小于的初始化为-1 将等于的化为0 运用前缀和和后缀和的方式 将中位数的左边取后缀和 中位数的右边取后缀和 左右两边的值是相反数即为一组 最终取共有几组即为中位数数列的个数