题目描述

首先我们简化一下题意:

要找一段区间[L,R],使区间[L,R]内元素最大值减最小值大于等于D。

做法:

首先很容易想到采用二分,分什么呢?

我们二分区间长度为mid

这个时候,检验就成为了我们的目标

最暴力的检验就是枚举左端点,在区间内找最大和最小,有一个max-min>=D

让我们模拟一下:

假如mid=2:

(1) [1,3]

(2) [2,4]

(3) [3 5]

(4) .....

我们震惊的发现:P1886 滑动窗口

这貌似有点相似

于是正解出现了

正解:

二分区间长度为mid,检验时用单调队列维护区间最大最小值,复杂度nlogn,更多细节见代码:

代码时间到:

#include<bits/stdc++.h>
using namespace std;
int n,D,l,r;
struct WATER{
int x,y;
}p[];
int ans=;
int q1[],q2[];
int p1[],p2[];
int head1=,tail1=,head2=,tail2=;
bool check(int k){
int L=;
q1[]=p[].y;p1[]=p[].x;
q2[]=p[].y;p2[]=p[].x;
head1=,tail1=,head2=,tail2=;
for(int i=;i<=n;i++){
while((p[i].x-p[L].x)>k) L++;
while(p1[head1]<p[L].x&&head1<=tail1)
head1++;
while(p2[head2]<p[L].x&&head2<=tail2)
head2++;
while(q1[tail1]<=p[i].y&&head1<=tail1)
tail1--;
p1[++tail1]=p[i].x;q1[tail1]=p[i].y;
while(q2[tail2]>=p[i].y&&head2<=tail2)
tail2--;
p2[++tail2]=p[i].x;q2[tail2]=p[i].y;
if((q1[head1]-q2[head2])>=D) return ;
}
return ;
}
bool cmp(WATER a,WATER b){
return a.x<b.x;
}
int main(){
scanf("%d%d",&n,&D);
for(int i=;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
l=,r=;
sort(p+,p+n+,cmp);
while(l<=r){
int mid=(l+r)/;
if(check(mid)){
r=mid-;
ans=min(ans,mid);
}
else l=mid+;
}
if(ans==) printf("-1");
else printf("%d",ans);
return ;
}

LuoguP2698 【[USACO12MAR]花盆Flowerpot】的更多相关文章

  1. 洛谷P2698 [USACO12MAR]花盆Flowerpot

    P2698 [USACO12MAR]花盆Flowerpot 题目描述 Farmer John has been having trouble making his plants grow, and n ...

  2. P2698 [USACO12MAR]花盆Flowerpot(单调队列+二分)

    P2698 [USACO12MAR]花盆Flowerpot 一看标签........十分后悔 标签告诉你单调队列+二分了............ 每次二分花盆长度,蓝后开2个单调队列维护最大最小值 蓝 ...

  3. [USACO12MAR] 花盆Flowerpot

    类型:二分+单调队列 传送门:>Here< 题意:给出$N$个点的坐标,要求根据$x$轴选定一段区间$[L,R]$,使得其中的点的最大与最小的$y$值之差$\geq D$.求$Min\{R ...

  4. [P2698][USACO12MAR]花盆Flowerpot

    Link: P2698 传送门 Solution: 对于可行区间$[L,R]$,随着$L$的递增$R$不会递减 因此可以使用尺取法来解决此题:不断向右移动左右指针,复杂度保持线性 同时为了维护区间内的 ...

  5. luogu2698 [USACO12MAR]花盆Flowerpot

    单调队列+二分答案 #include <algorithm> #include <iostream> #include <cstring> #include < ...

  6. [USACO12MAR]花盆Flowerpot (单调队列,二分答案)

    题目链接 Solution 转化一下,就是个单调队列. 可以发现就是一段区间 \([L,R]\) 使得其高度的极差不小于 \(d\) ,同时满足 \(R-L\) 最小. 然后可以考虑二分然后再 \(O ...

  7. P2698 [USACO12MAR]花盆Flowerpot 单调队列

    https://www.luogu.org/problemnew/show/P2698 警示 用数组写双端队列的话,记得le = 1, ri = 0:le<=ri表示队列非空 题意 求一个最小的 ...

  8. P2698 [USACO12MAR]花盆Flowerpot——单调队列

    记录每天看(抄)题解的日常: https://www.luogu.org/problem/P2698 我们可以把坐标按照x递增的顺序排个序,这样我们就只剩下纵坐标了: 如果横坐标(l,r)区间,纵坐标 ...

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

    刷水~ Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in&quo ...

随机推荐

  1. Vue绑定事件,双向数据绑定,只是循环没那么简单

    v-on对象处理 <p @mouseover = "doTish" @mouseout = "doThat"> 对象形式 </p> &l ...

  2. uni app 零基础小白到项目实战2

    <template> <scroll-view v-for="(card, index) in list" :key="index"> ...

  3. Map、Set、List是否有序

    首先我们应该清楚这个概念:这里的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象. list是按照元素的添加顺序来存储对象的,因此是有序的.他的实现类ArrayList.Linked ...

  4. 分析WordPress数据表之分类标签表(功能篇)

    数据表分析 wp_terms(分类标签表) 表字段如下:term_id(分类或标签ID)name(分类或标签名)slug(别名)term_group(分类标签组,我想应该是用于排序分组) wp_ter ...

  5. java复制对象之深拷背

    在java开发中,有时我们需要复制对象,并且确保修改复制得到的对象不会影响原来的对象. 于是,有些人可能会写出类似以下的代码: public class CloneTest { public stat ...

  6. nginx 日志打印响应时间 request_time 和 upstream_response_time

    设置log_format,添加request_time,$upstream_response_time,位置随意 og_format  main  '"$request_time" ...

  7. SpringMVC(十五):Dispatcher的重要组件之一MultipartResolver(StandardServletMultipartResolver和CommonsMultipartResolver)的用法

    MultipartResolver组件 从Spring官网上可以看到MultipartResolver接口的定义信息: public interface MultipartResolver A str ...

  8. 内存映射文件MappedByteBuffer和Buffer的Scattering与Gathering

    上一篇讲到的DirectByteBuffer继承自MappedByteBuffer 一.MappedByteBuffer MappedByteBuffer的定义: A direct byte buff ...

  9. Sword 正则表达式

    Metacharacters(元字符) 在正则表达式中有一些具有特殊含义的字母,被称为元字符,简言之,元字符就是描述字符的字符,它用于对字符表达式的内容.转换及各种操作信息进行描述. \ 将下一个字符 ...

  10. osgearth显示中文标签

    首先将带有中文的字符串转换成string void unicodeToUTF8(const wstring &src, string& result){int n = WideChar ...