hdu5806 two-pointers

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zz_ylolita/article/details/52175615

头尾两个指针扫就可以了,注意ans非常大,要用long long ,输入输出要配套

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int T,n,m,k,x,s,i,j;
long long ans;
int a[200010];
int main()
{
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d%d%d", &n, &m, &k);
        memset(a,sizeof(a),0);
        for (int i=1;i<=n;i++)
        {
            scanf("%d", &x);
            if (x>=m) a[i]=1; else a[i]=0;
        }
        ans=0;
        s=a[1];i=1;j=1;
        while (i<=j && j<=n)
        {
            if (s>=k)
            {
                ans+=(n-j+1);
                s-=a[i];
                i++;
            }
            while (s<k && j<=n) {j++;s+=a[j];}
        }
        printf("%I64d\n", ans);
    }
}


猜你喜欢

转载自blog.csdn.net/zz_ylolita/article/details/52175615
今日推荐