LuoguP2698 【[USACO12MAR]花盆Flowerpot】
题目描述
首先我们简化一下题意:
要找一段区间[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】的更多相关文章
- 洛谷P2698 [USACO12MAR]花盆Flowerpot
P2698 [USACO12MAR]花盆Flowerpot 题目描述 Farmer John has been having trouble making his plants grow, and n ...
- P2698 [USACO12MAR]花盆Flowerpot(单调队列+二分)
P2698 [USACO12MAR]花盆Flowerpot 一看标签........十分后悔 标签告诉你单调队列+二分了............ 每次二分花盆长度,蓝后开2个单调队列维护最大最小值 蓝 ...
- [USACO12MAR] 花盆Flowerpot
类型:二分+单调队列 传送门:>Here< 题意:给出$N$个点的坐标,要求根据$x$轴选定一段区间$[L,R]$,使得其中的点的最大与最小的$y$值之差$\geq D$.求$Min\{R ...
- [P2698][USACO12MAR]花盆Flowerpot
Link: P2698 传送门 Solution: 对于可行区间$[L,R]$,随着$L$的递增$R$不会递减 因此可以使用尺取法来解决此题:不断向右移动左右指针,复杂度保持线性 同时为了维护区间内的 ...
- luogu2698 [USACO12MAR]花盆Flowerpot
单调队列+二分答案 #include <algorithm> #include <iostream> #include <cstring> #include < ...
- [USACO12MAR]花盆Flowerpot (单调队列,二分答案)
题目链接 Solution 转化一下,就是个单调队列. 可以发现就是一段区间 \([L,R]\) 使得其高度的极差不小于 \(d\) ,同时满足 \(R-L\) 最小. 然后可以考虑二分然后再 \(O ...
- P2698 [USACO12MAR]花盆Flowerpot 单调队列
https://www.luogu.org/problemnew/show/P2698 警示 用数组写双端队列的话,记得le = 1, ri = 0:le<=ri表示队列非空 题意 求一个最小的 ...
- P2698 [USACO12MAR]花盆Flowerpot——单调队列
记录每天看(抄)题解的日常: https://www.luogu.org/problem/P2698 我们可以把坐标按照x递增的顺序排个序,这样我们就只剩下纵坐标了: 如果横坐标(l,r)区间,纵坐标 ...
- luogu 2698 [USACO12MAR]花盆Flowerpot 单调队列
刷水~ Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in&quo ...
随机推荐
- Sliding Window Median
Description Given an array of n integer, and a moving window(size k), move the window at each iterat ...
- Xamarin.Forms之样式
使用XAML样式设置Xamarin.Forms应用的样式Xamarin.Forms应用程序的样式传统上是通过使用Style类将一组属性值分组到一个对象中来完成的,然后可以将其应用于多个视觉元素实例. ...
- [Java] Spring boot 的maven设置阿里云仓库
Spring boot 的maven设置阿里云仓库 打开根目录下的 pom.xml 文件,在对应为止出加入如下 红色 代码: <build> <plugins> <plu ...
- windows下redis的配置文件(redis.windows.conf)
#redis的配置 #Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize yes #当Redis以守护进程方式运行时,Redis默认会把pid写入 ...
- 【LG2839】[国家集训队]middle
[LG2839][国家集训队]middle 题面 洛谷 题解 按照求中位数的套路,我们二分答案\(mid\),将大于等于\(mid\)的数设为\(1\),否则为\(-1\). 若一个区间和大于等于\( ...
- 初始化错误——从一个简单的算例看UDF各个宏的调用顺序
感谢西安交通大学en_phert的问题和尝试 Fluent版本:Fluent 19.0 Visual Studio版本:Visual Studio 2013 在UDF的宏的调用中大家常看见下图: 这个 ...
- js正则表达式之解决html解析<>标签问题
应用场景:以博客写文章为例,有的时候我们不经意间写的字符串带标签,然后浏览器将其解析了,实际上我们并不希望其被解析,于是可通过核心代码解决该问题. 核心代码如下: data.codeSource.re ...
- 表格样式、表格css、
.mytab{ border-collapse: collapse;}.mytab tr,.mytab td,.mytab th{ text-align: center; border: 1px so ...
- 数据库与spring事务传播特性
一.spring事务管理的实现原理,基于AOP 1) REQUIRED ,这个是默认的属性 Support a current transaction, create a new one if non ...
- ubuntu16 安装 qBittorrent ( Linux下BT下载图形工具 )
qBittorrent 是QT编写的一款BT下载软件,支持FreeBSD, Linux, macOS, OS/2, Windows: 官网:https://www.qbittorrent.org/ 在 ...