题目:中位数
思路:乱搞一下……
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100000
#define ll long long
int n,b;
int a[maxn+5];
int pos;
int sm[maxn+5],bg[maxn+5];
void read(int& x) {
scanf("%d",&x);
}
void readin() {
read(n);read(b);
for(int i=1;i<=n;i++) read(a[i]);
}
void find() {
for(int i=1;i<=n;i++) if(a[i]==b) pos=i;
for(int i=1;i<=n;i++) {
bg[i]=bg[i-1],sm[i]=sm[i-1];
if(a[i]>b) bg[i]++;
if(a[i]<b) sm[i]++;
}
}
int cnt[maxn*2+5];
ll slv() {
ll ans=0;
cnt[n]++;
for(int i=1;i<=n;i++) {
int s=sm[i]-bg[i]+n;
if(i>pos) ans+=cnt[s];
else if(i<pos) cnt[s]++;
}
int s=0;
for(int i=pos;i>=1;i--) {
if(a[i]>b) s++;
if(a[i]<b) s--;
if(s==0) ans++;
}
return ans;
}
ll baoli(){
ll ans=0;
for(int i=1;i<=pos;i++) {
for(int j=pos;j<=n;j++) {
if((j-i+1)&1) {
int s=0;
for(int k=i;k<=j;k++) {
if(a[k]>b) s++;
if(a[k]<b) s--;
}
if(s==0) ans++;
}
}
}
return ans;
}
int main() {
readin();
find();
ll ans;
if(n<=100) ans=baoli();
else ans=slv();
printf("%lld",ans);
return 0;
}