题目大意是给你一串数列,问你数列中某个区间的第K大的数大于M的区间个数有多少个。
把数组写下来仔细想一想,为了简化问题,大于K的数我们是不是可以把它变成1,反之为0。这样子的话,我们就能用尺取法。
就是如果一个区间的数值和大于等于K的话,之后的数都可以加进来。
所以尺取法
下见代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#define LL long long
using namespace std;
int a[210000];
int main()
{
int t,n,m,k;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&k);
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
if(x>=m) a[i]=1;
else a[i]=0;
}
LL ans = 0;
int r = 0,num = 0;//注意下标
for(int i=1;i<=n;i++){
while(num<k && r<n) {r++; num+=a[r];}
if(num < k) break;
ans += (n-r+1);//注意下标
num -= a[i];
}
printf("%lld\n",ans);
}
return 0;
}
拿到一个问题我们可以先把它简化一下,这样子有利于我们后续思考。