内容概述:
有一个1~n的排序,计算长度为奇数、以b为中位数的连续子序列和个数
题解:
b本身符合题意,故ans初始化为1。
大于b的数用1标记,小于b的用-1标记,等于b的用0标记,并记录p
先计算只b右边的,从p+1开始计算p+1到该位置的和,等于0的为一个子序列
只在b左侧的同理
计算在b左右两边都有的要借助num数组在num[n+k]处b的右侧记录和为k的个数,然后在b的左边找和与之互为相反数的个数加到ans中就可以了。
#include<iostream>
using namespace std;
struct mid
{
int num;
int greatero,mido,lesso;
int greater,mid,less;
};
int main()
{
int a[100001],num[200001]={0};
int n,b;
int p,i;
int ans=1,sum;
cin>>n>>b;
for(i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]>b)
a[i]=1;
else if(a[i]<b)
a[i]=-1;
else if(a[i]==b)
{
p=i;
a[i]=0;
}
}
for(i=p+1;i<=n;i++)
{
a[i] += a[i-1];
sum=a[i];
if(a[i]==0)
ans++;
num[n+sum]++;
}
for(i=p-1;i>0;i--)
{
a[i] += a[i+1];
sum=a[i];
if(a[i]==0)
ans++;
ans += num[n-sum];
}
cout<<ans;
return 0;
}