题目:
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。
输入: 7 4 5 7 2 4 3 1 6 输出: 4
易错点:
超时问题,一开始做是比较每个数与中位数 ,然后循环寻找,就超时了。正确做法是利用前缀和。
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+5;
int q[N];
typedef long long ll;
int main(){
int n,b;
int m;
int cnt;
cin>>n>>b;
for(int i=1;i<=n;i++){
cin>>m;
if(m==b){
cnt=i;
q[i]=0+q[i-1];
}
else if((b-m)<0)q[i]=1+q[i-1];//比4大
else q[i]=-1+q[i-1];
}
ll sum=0;
int k;
for(int i=1;i<=cnt;i++){
if((cnt-i)%2==1)k=max(i,cnt+1);
else k=max(i,cnt);
for(int j=k;j<=n;j+=2){
int dif=q[j]-q[i-1];
if(dif==0){
//cout<<i<<" "<<j<<endl;
sum++;
}
}
}
cout<<sum;
return 0;
}