題意:數列中有多少個區間裏的第k大的數不大於m
思路:這個題意換句話說,就是一個區間裏面是否有k個數大於等於m,一個性質是如果當前區間已經滿足前面的條件,那麼再往這個區間添數字,也必然滿足這個條件,可以想到挑戰程序設計裏說的尺取法,也可以說是其他數字對這個區間的貢獻值。要注意ans要開longlong,可以想到當k=1,數列裏所有數都大於m時,便會超過n^2
鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5806
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 200005;
typedef long long ll;
int a[maxn];
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
int l = 1, r = 1, num = 0;
ll ans = 0;
while(l <= n)//這裏不是r <= n,因爲存在一組數據是某一個點到數列尾部全都是大於等於m的數
{
while(r <= n && num < k)
{
if(a[r++] >= m)
num++;
}
if(num >= k)
ans += n - r + 2;
if(a[l] >= m)
num--;
l++;
}
printf("%I64d\n", ans);
}
return 0;
}