luogu 2698 [USACO12MAR]花盆Flowerpot 单调队列

刷水~

Code: 

#include<bits/stdc++.h>
using namespace std; 
#define setIO(s) freopen(s".in","r",stdin) 
#define maxn 300000 
#define inf 1000000 
deque<int>p,q; 
struct Node 
{ 
    int x,y;  
}nd[maxn]; 
bool cmp(Node a, Node b) 
{
    return a.x < b.x; 
} 
int main()
{
    // setIO("input");      
    int n,D,ans=inf; 
    scanf("%d%d",&n,&D);
    for(int i=1;i<=n;++i) 
    {
        scanf("%d%d",&nd[i].x,&nd[i].y); 
    }
    sort(nd+1,nd+1+n,cmp);  
    for(int i=1;i<=n;++i) 
    {
        while(!p.empty()&&nd[i].y>=nd[p.back()].y) p.pop_back();      
        while(!q.empty()&&nd[i].y<=nd[q.back()].y) q.pop_back();   
        p.push_back(i), q.push_back(i);   
        int pre=0;  
        while(!p.empty()&&nd[p.front()].y-nd[i].y>=D) { pre=nd[p.front()].x;  p.pop_front(); } 
        if(pre) ans=min(ans, nd[i].x - pre); 
        pre=0; 
        while(!q.empty()&&nd[i].y-nd[q.front()].y>=D) { pre=nd[q.front()].x;  q.pop_front(); }  
        if(pre) ans=min(ans, nd[i].x - pre); 
    }
    printf("%d\n",ans==inf?-1:ans);      
    return 0; 
}

  

posted @ 2019-07-21 11:05  EM-LGH  阅读(166)  评论(0编辑  收藏  举报