HDU5806:尺取法

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

猜你喜欢

转载自blog.csdn.net/weixin_42264485/article/details/88826850