HDU 5289 Assignment (尺取+Set)

来源:互联网 发布:如何还房贷最划算知乎 编辑:程序博客网 时间:2024/04/28 19:45

题意:n个数字中取出连续的一组数字使得任意两个差小于k,求方案数。

解析:two points,用multiset维护一下区间差值即可。

[code]:

#include<cstdio>#include<cstring>#include<set>using namespace std;typedef long long LL;const int maxn = 1e5+5;int n,m;LL a[maxn];multiset<LL> ms;multiset<LL>::iterator it;void init(){    ms.clear();}void add(LL x){    ms.insert(x);}void del(LL x){    ms.erase(ms.find(x));}bool ok(){    LL val;    if(ms.size()<2) return true;    it = ms.end();    --it;    return *it-*ms.begin()<m;}int main(){    int i,j,cas;    scanf("%d",&cas);    while(cas--){        scanf("%d%d",&n,&m);        init();        for(i = 1;i <= n;i++) scanf("%lld",&a[i]);        LL ans=  0;        for(i = j = 1;i <= n;i++){            for(;j <= n;j++){                add(a[j]);                if(!ok()){                    del(a[j]);                    break;                }            }//printf("%d %d\n",i,j);            ans += ms.size();            del(a[i]);        }        printf("%lld\n",ans);    }    return 0;}



0 0