题意:求满足第K大的数
>=m
的区间个数
解题思路:将这N个数
>=m
的标记为1,
<m
<script type="math/tex" id="MathJax-Element-39">
一个区间满足第k大的数
>=m
,即该区间的1的个数
>=k
.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int cnt[200000+10];
ll dp[100000+10];
int main()
{
int T;
scanf("%d",&T);
int n,m,k;
ll ans;
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
memset(cnt,0,sizeof(cnt));
int a;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
if(a<m)
cnt[i]=0;
else cnt[i]=1;
}
ans=0;
int num=0;
int i,j=0;
for(i=0;i<k;i++)
if(cnt[i])num++;
while(j<n)
{
while(i<n&&num<k)
{
if(cnt[i])
num++;
i++;
}
if(i>=n&&num<k)
break;
ans+=n-i+1; ///因为区间内>=m的个数 >=k都满足
if(cnt[j]) ///当cnt[j]==1时,此时这个区间>=m的数小于k
num--; /// 所以要找到下一个>=m的数。
j++;
}
printf("%I64d\n",ans);
}
return 0;
}