前几天打bestcode 的时候 里面有一道题目是用尺取法。。 然而。。我没看出来(主要是问题的转化过程)
先说说尺取法的使用范围吧 在一段区间里面 寻找满足条件的区间个数问题
先上题目 hdu5806 题目是求满足条件的区间个数 所以可以用尺取法 那么关键就来了 如果确定区间 这里转换一下 需要满足区间里面第k大的数不小于m 那么 我们记录不小于m的个数就好了
#include "cstdio" #include "iostream" #include "cstring" #include "algorithm" using namespace std; /*题意: 07.给一个数列,给定一组m,k值,求有多少个人区间里第k大的数不小于m 08.做法: 09.尺取法 10.*/ int a[200010]; int main() { int T;scanf("%d",&T); while(T--) { int n,m,k; scanf("%d%d%d",&n,&m,&k); //第k大的数,不小于m for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } int st=1,ed=0,cnt=0; long long ans=0; while(st<=n)//从第一个遍历到最后 { //一旦够数,就停止加 while(cnt<k && ed+1<=n) cnt+=(a[++ed]>=m);//满足条件为1 //若有k个大于m,加起来 if(cnt==k) ans=ans+n-ed+1; // 前面都已经够数了,后面怎么添都可以 //每走一步,如果最开头的数 大于m,减掉,继续往后找 cnt-=(a[st++]>=m); } printf("%I64d ",ans); } return 0; }