HDU5806
题意:
-
多少子序列的第k大的数不小于m。
题解:
- 如果某个序列含有k个数大于等于m,那么可以保证加上后面的数,还是满足第k大的数大于等于m。
- 所以用尺取法,从头到尾扫描,每找到一段区间[l,r],满足有k个数大于等于m,那么区间[l,r...n]都是满足条件的,有n - r + 1种。
代码
#include <bits/stdc++.h>
using namespace std;
int const N = 200000 + 10;
int const inf = 0x7f7f7f7f;
typedef long long ll;
int a[N];
int n,m,k;
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int st = 1,cnt = 0;
ll ans = 0;
for(int i=1;i<=n;i++){
if(a[i] >= m) cnt++;
while(cnt == k){
ans += (n - i + 1);
if(a[st++] >= m) cnt--;
}
}
cout<<ans<<endl;
}
return 0;
}