B题
我们可以预先处理出所有小于 x 的值,给当前位置 pre[i] 加上 1 ,然后处理出前缀和,可以通过前缀和的差值知道每个区间的小于 x 的值的数量,对于 i 位置的pre[i] 一定需要一个pre[i] + k - 1 才能保证该区间的 < x 的数量刚好为k - 1,可以通过二分查找到最大位置和最小位置, 然后对于 x 所对应的位置 pos 一定要包含在内 ,判断一下即可。
#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
int a[maxn];
int pre[maxn];
int main(){
int n, x, k;
scanf("%d%d%d",&n,&x,&k);
int ans = 0, pos;
for(int i = 1;i <= n;i++){
scanf("%d",&a[i]);
if(a[i] < x) pre[i]++;
if(a[i] == x) pos = i;
}
for(int i = 1;i <= n;i++){
pre[i] += pre[i - 1];
}
for(int i = 0;i <= pos - 1;i++){
int pos1 = lower_bound(pre + 1,pre + 1 + n, pre[i] + k - 1) - pre;
int pos2 = upper_bound(pre + 1,pre + 1 + n, pre[i] + k - 1) - pre;
if(pos1 > pos && pos2 > pos) ans += abs(pos2 - pos1);
if(pos2 > pos && pos1 < pos) ans += abs(pos2 - pos);
}
printf("%d\n",ans);
}
京公网安备 11010502036488号