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); }