• P2698 [USACO12MAR]花盆Flowerpot 单调队列


      

    老板需要你帮忙浇花。给出N滴水的坐标,y表示水滴的高度,x表示它下落到x轴的位置。

    每滴水以每秒1个单位长度的速度下落。你需要把花盆放在x轴上的某个位置,使得从被花盆接着的第1滴水开始,到被花盆接着的最后1滴水结束,之间的时间差至少为D。

    我们认为,只要水滴落到x轴上,与花盆的边沿对齐,就认为被接住。给出N滴水的坐标和D的大小,请算出最小的花盆的宽度W。

    输入输出格式

    输入格式:

    第一行2个整数 N 和 D。

    第2.. N+1行每行2个整数,表示水滴的坐标(x,y)。

    输出格式:

    仅一行1个整数,表示最小的花盆的宽度。如果无法构造出足够宽的花盆,使得在D单位的时间接住满足要求的水滴,则输出-1。

    维护单调队列的最大最小值   然后滑动窗口就行了

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
    #define pb push_back
    #define inf 0x3f3f3f3f
    #define CLR(A,v)  memset(A,v,sizeof A)
    #define lson l,m,pos<<1
    #define rson m+1,r,pos<<1|1
    typedef pair<int,int>pii;
    //////////////////////////////////
    const int N=1e6+10;
    deque<int>qmax,qmin;
    struct node
    {
        int x,y;
    }s[N];
    int n,d;
    bool cmp(node a,node b){return a.x<b.x;}
    int sol()
    {
        scanf("%d%d",&n,&d);
        rep(i,1,n)RII(s[i].x,s[i].y);
        sort(s+1,s+1+n,cmp);
    
        int r=1,ans=1e9;
        qmax.push_back(1);qmin.push_back(1);
        for(int l=1;l<=n-1;l++)
        {
            while(!qmax.empty()&&qmax.front()<l)qmax.pop_front();
            while(!qmin.empty()&&qmin.front()<l)qmin.pop_front();
            
            while((s[qmax.front()].y-s[qmin.front()].y<d)&&r<n)
            {
                r++;
                while( !qmin.empty()&&s[qmin.back()].y>s[r].y)qmin.pop_back();
                while( !qmax.empty()&&s[qmax.back()].y<s[r].y)qmax.pop_back();
                qmin.push_back(r);qmax.push_back(r);
            }
            if(s[qmax.front()].y-s[qmin.front()].y>=d)
            ans=min(ans, abs(s[qmax.front()].x-s[qmin.front()].x) );
        }
        return ans;
    }
    int main()
    {
        int ans=sol();
        printf("%d
    ",ans==1e9?-1:ans);
    }
    View Code
  • 相关阅读:
    Ubuntu下安装git
    curl: (48) An unknown option was passed in to libcurl怎么解决
    python中如何删除列表中的所有元素
    北京游园有感
    keras 实现人工神经网络
    scikit-learn实现简单的决策树
    angularjs实战
    Ajax实战(原生)
    7.DockerCompose 搭建 Redis
    使用element中的el-upload获取本地文件并转为base64码实现预览
  • 原文地址:https://www.cnblogs.com/bxd123/p/11216947.html
Copyright © 2020-2023  润新知