题目描述

今天,HH正在学习一种名为分段树的新数据结构,它通常用于解决分段问题,这里有一个: 给你一个长度为n的无序序列,(a1一个2,...,an),现在你应该计算有多少段[L,R](1≤L≤R)满足两个条件: 1.段的长度为 k(即 R−L+1=k)。 2.L和R之间的数字(包括)总共至少出现q次。 HH认为问题太容易了,所以他把问题告诉你。

using namespace std;
int a[102],cnt[102];
int main() {
	int t;
	cin>>t;
	while(t--){
		int n,k,q,count=0;
		cin>>n>>k>>q;
		memset(cnt,0,sizeof(cnt));//每轮都要初始化为0 
		for(int i=1;i<=n;i++){
			cin>>a[i];
			cnt[a[i]]++;//用桶排序的思想,把数据装进去,每次装入一个数据,桶就加一
		}
		for(int i=1;i<=100+1-k;i++)//R-L+1=k;i的最大是i=100+1-k;
		{
			int num=0;
			for(int j=i;j<=k-1+i;j++){//因为R-L+1=K;所以R最大是R=k-1+i;
			num+=cnt[j];
			}
			if(num>=q){
				count++;
			}
		}
		cout<<count<<endl;
	}
	return 0;
}