老板需要你帮忙浇花。给出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); }