[USACO12MAR]花盆Flowerpot,洛谷P2698,单调队列维护极值

正题

      这题看上去摸不着头脑,但是想想最大减最小,我们就会知道用两个单调队列来维护。

      首先维护一个最大值的单调队列和最小值的单调队列,然后令当前最大值和最小值相减,看一下是否大于等于d,如果是,那么就记录答案,并不断把l向前移,直到最大值减最小值小于d时。

      就是这样。

#include
#include
#include
#include
#include
using namespace std;

int n,d;
struct node{
	int x,y;
	bool operator<(const node a)const{
		return x=t1 && list1[h1].y>s[i].y) h1--;list1[++h1]=s[i];
		while(h2>=t2 && list2[h2].y=d && t1<=h1 && t2<=h2){
			ans=min(ans,s[i].x-s[l].x);
			if(list1[t1].x==s[l].x) t1++;
			if(list2[t2].x==s[l].x) t2++;
			l++;
		}
	}
	if(ans==1e9) printf("-1");
	else printf("%d",ans);
}

 

你可能感兴趣的:([USACO12MAR]花盆Flowerpot,洛谷P2698,单调队列维护极值)