题解:[USACO12MAR]花盆Flowerpot 【单调队列】

对于这个题目,我们有两种方法(其实都是单调队列)

  • 第一种,我们考虑二分答案,每次二分一个宽度,看最大和最小的差是否能到达d
  • 第二种,我们考虑直接统计答案,每当高度差相差超过d的时候就直接进行统计答案,然后弹出队首,因为这个时候对手已经没用了
#include 
#include 
#include 
using namespace std;

#define ll long long
#define re register
#define gc getchar()
inline int read()
{
	re int x(0);re char ch(gc);
	while(ch<'0'||ch>'9') ch=gc;
	while(ch>='0'&&ch<='9') x=(x*10)+(ch^48),ch=gc;
	return x;
}

const int N=1e6+10,INF=1e9+7;
int n,d;
struct node {int x,y;}a[N],q[N*10];
bool operator < (node a,node b) {return a.x<b.x;}

int main()
{
	n=read(),d=read();
	for(int i=1;i<=n;++i) 
		a[i].x=read(),a[i].y=read();
	sort(a+1,a+1+n);
	int l=1,r=1,ans=INF;
	q[1]=a[1];
	for(int i=2;i<=n;++i)
	{
		while(q[r].y>a[i].y&&l<=r) --r;
		q[++r]=a[i];
		while(l<=r&&q[r].y-q[l].y>=d)
		{
			ans=min(ans,q[r].x-q[l].x);
			++l;
		}
	}
	if(ans==INF) cout<<-1<<endl;
	else cout<<ans<<endl;
	return 0;
}

你可能感兴趣的:(题解,DP)