題目:http://www.lydsy.com/JudgeOnline/problem.php?id=1303
思路:由于滿足區(qū)間減法叹卷,所以可以把比b大的數(shù)希俩,小的數(shù)處理成一個前綴和的形式查詢洲尊。
設s1(l,r)表示在區(qū)間[l,r]比b大的數(shù)的數(shù)目,s2(l,r)表示在區(qū)間[l,r]比b小的數(shù)的數(shù)目,num(S)表示集合中元素的數(shù)目,t表示b在數(shù)列中位置****
****f(i)=num({x|x=i;****x=s1(t+1,j)-s2(t+1,j),j>=t****})****
****然后答案就是sigma(i=1->t;f(s2(i,t)-s1(i,t)))****
****代碼:****
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 300000
#define D 100001
int f[MAXN];
int a[MAXN];
int b,n,t;
int s1[MAXN],s2[MAXN];
int main(){
scanf("%d%d",&n,&b);
s1[0]=0;
s2[0]=0;
for (int i=0;i++<n;){
scanf("%d",&a[i]);
if (a[i]<b){
s1[i]=s1[i-1]+1;
} else s1[i]=s1[i-1];
if (a[i]>b){
s2[i]=s2[i-1]+1;
} else s2[i]=s2[i-1];
if (a[i]==b){
t=i;
}
}
memset(f,0,sizeof(f));
f[0+D]=1;
for (int i=t;i++<n;){
f[(s2[i]-s2[t])-(s1[i]-s1[t])+D]++;
}
int ans=0;
for (int i=0;i++<t;){
ans+=f[-((s2[t-1]-s2[i-1])-(s1[t-1]-s1[i-1]))+D];
}
printf("%d\n",ans);
return 0;
}