HDU 5806 NanoApe Loves Sequence Ⅱ(尺取法)

来源:互联网 发布:流星网络电视在线直播 编辑:程序博客网 时间:2024/06/06 07:06

题目链接
把给出的数组中的大于m的看做1,否则看做0,得到一个01数组,问题等价转换为求数组中,有多少区间1的个数大于等于k,也就是有几个区间的和是不小于k的,就是尺取法的题目了

#include<cstdio>#include<algorithm>#include<iostream>#include<vector>#include<queue>#include<cstring>#include<map>#include<string>#include<set>#include<cstdlib>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define LL long long#define pb push_back#define For(i,j,k) for(int i=(j);i<k;i++)#define lowbit(i) (i&(-i))#define _(x) printf("%d\n",x)const int maxn = 1e6+200;const int inf  = 1 << 28;int a[maxn];LL n,m,k;int main(){    int T;scanf("%d",&T);    while(T--){        scanf("%lld%lld%lld",&n,&m,&k);        for(int i=0;i<n;i++){            LL x;scanf("%lld",&x);            if(x>=m)a[i]=1;            else a[i]=0;        }        LL sum = 0;        int st = 0,ed = 0;        LL s = 0;        while(true){            while(ed<n&&s<k)s+=a[ed++];            if(s<k)break;            sum+=n-ed+1;            s-=a[st++];        }        printf("%lld\n",sum);    }    return 0;}
0 0
原创粉丝点击