题目描述

首先我们简化一下题意:

要找一段区间[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. pg_flame postgresql EXPLAIN ANALYZE 火焰图工具

    pg_flame 是golang 编写的一个将pg的EXPLAIN ANALYZE 转换为火焰图,使用简单 以下是一个简单的demo 环境准备 docker-compose 文件   version: ...

  2. ent 基本使用六 Mixin

    ent 的Mixin 可以让我们服用已有的schema Mixin 接口说明 type Mixin interface { Fields() []ent.Field } 一个demo 代码 // -- ...

  3. codeblocks异常退出

    ExceptionAn exception has been raised! The application encountered an error atC:\CB1312\src\sdk\conf ...

  4. poj2398 Toy Storage 计算几何,叉积,二分

    poj2398 Toy Storage 链接 poj 题目大意 这道题的大概意思是先输入6个数字:n,m,x1,y1,x2,y2.n代表卡片的数量,卡片竖直(或倾斜)放置在盒内,可把盒子分为n+1块区 ...

  5. 自制Amiibo 踩坑/填坑 指南

    去年买了台老版NS,后来得知有Amiibo这种东西的存在,但是学校附近都买不到. 再后来网上看见有人在X宝卖自制卡片,就寻思着是否能自己 DIY一套,于是掉坑里. 要想使用自制Amiibo,一共要做两 ...

  6. [sdoi 2017]树点涂色

    传送门 Description Bob 有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob 在每个节点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是,这条路径上的点(包括起点 ...

  7. 暗黑战神! Unity3D网游ARPG实战案例

    前面开发了几个单机小游戏,该是时候挑战一下网络游戏方面的开发了! 3D网游ARPG实战案例(第二季),使用Unity2017.3版本制作 内容包括 服务端部分 1.网络通信编码,协议及传输 2.数据驱 ...

  8. C++11原子操作与无锁编程(转)

    不讲语言特性,只从工程角度出发,个人觉得C++标准委员会在C++11中对多线程库的引入是有史以来做得最人道的一件事:今天我将就C++11多线程中的atomic原子操作展开讨论:比较互斥锁,自旋锁(sp ...

  9. mybatis ResultHandler vs ResultSetHandler及自定义扩展

    ResultSetHandler是mybatis的关键类之一,用于对jdbc返回的ResultSet进行映射处理,其中包括列前缀处理,逻辑分页,鉴别器(Discriminator,基于值实现动态映射列 ...

  10. 015 vue的项目

    一:搭建项目 1.框架 在原有的基础上 src: 2.index.html <!DOCTYPE html> <html lang="en"> <hea ...