hdoj5806【尺取】

(补题,妈蛋那时候大哥给我说是尺取,我不想打…真是艾斯比了…)
题意:
退役狗 NanoApe 滚回去学文化课啦!

在数学课上,NanoApe 心痒痒又玩起了数列。他在纸上随便写了一个长度为 n 的数列,他又根据心情写下了一个数 m。

他想知道这个数列中有多少个区间里的第 k 大的数不小于 m,当然首先这个区间必须至少要有 k个数啦。

思路:
首先就是大于m阿,然后,然后再去判断一下在区间内的大于m个的数有没有大于k,大于的话就保证这个区间包括后面所有都可以满足题目条件。。很水的尺取。。。
贴一发挫code…….

#include <iostream>
#include <cstdio>
#include<vector>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;

const int N=2e5+10;
int a[N];
int s,e,cnt;
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]);

        LL ans=0;
        cnt=e=0;

        for(s=1;s<=n;s++)
        {
            while(cnt<k&&e<=n)
            {
                if(a[++e]>=m)
                    cnt++;
            }
            if(cnt>=k)
                ans+=n-e+1;
            if(a[s]>=m)
                --cnt;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

​​

posted @ 2016-08-08 13:55  see_you_later  阅读(86)  评论(0编辑  收藏  举报