zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    LeetCode Missing Number (简单题)
    LeetCode Valid Anagram (简单题)
    LeetCode Single Number III (xor)
    LeetCode Best Time to Buy and Sell Stock II (简单题)
    LeetCode Move Zeroes (简单题)
    LeetCode Add Digits (规律题)
    DependencyProperty深入浅出
    SQL Server存储机制二
    WPF自定义RoutedEvent事件示例代码
    ViewModel命令ICommand对象定义
  • 原文地址:https://www.cnblogs.com/bxd123/p/11216947.html
Copyright © 2011-2022 走看看