题目链接
把给出的数组中的大于m的看做1,否则看做0,得到一个01数组,问题等价转换为求数组中,有多少区间1的个数大于等于k,也就是有几个区间的和是不小于k的,就是尺取法的题目了
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<map>
#include<string>
#include<set>
#include<cstdlib>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define LL long long
#define pb push_back
#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)
const int maxn = 1e6+200;
const int inf = 1 << 28;
int a[maxn];
LL n,m,k;
int main(){
int T;scanf("%d",&T);
while(T--){
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=0;i<n;i++){
LL x;scanf("%lld",&x);
if(x>=m)a[i]=1;
else a[i]=0;
}
LL sum = 0;
int st = 0,ed = 0;
LL s = 0;
while(true){
while(ed<n&&s<k)s+=a[ed++];
if(s<k)break;
sum+=n-ed+1;
s-=a[st++];
}
printf("%lld\n",sum);
}
return 0;
}