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 ...
随机推荐
- luogu_4762: [CERC2014]Virus synthesis
洛谷_4762:[CERC2014]Virus synthesis 题目描述: 初始有一个空串,利用下面的操作构造给定串\(S\).\(len(S)\leq10^5\) 1: 串开头或末尾加一个字符. ...
- Centrifugo 语言无关的实时消息服务
Centrifugo 语言无关的实时消息服务,基于golang编写,提供了websocket 以及sockjs 的兼容处理,使用上很简单 同时也支持基于redis的扩展,以下是一个简单的运行测试 环境 ...
- Reactive Extensions (Rx) 入门(1) —— Reactive Extensions 概要
译文:https://blog.csdn.net/fangxing80/article/details/7381619 原文:http://www.atmarkit.co.jp/fdotnet/int ...
- [题解向] Luogu2146[NOI2015]软件包管理器
#\(\mathcal{\color{red}{Description}}\) \(Link\) 一道\(zz\)的树剖题\(qwq\). #\(\mathcal{\color{red}{Soluti ...
- mac 以多tab的方式打开
让mac 始终以多tab的方式打开程序 背景: 开发中始终需要多个 项目 的方式进行处理, 但一直使用 `command + `` 的方式总是比较烦人, 有没有一个比较好的视图方式呢; 即我想在一个窗 ...
- 这个中秋,我用 Java 画了一个月饼!
栈长代表微信公众号 "Java技术栈" 祝所有粉丝中秋佳节快乐! 为了用一种特殊的方式表达我的心意,去年中秋节,我写了这篇文章: 为了写中秋这篇文章,我学了 20 种编程语言! 没 ...
- Better intuition for information theory
Better intuition for information theory 2019-12-01 21:21:33 Source: https://www.blackhc.net/blog/201 ...
- clumsy 模拟网络丢包延迟
https://www.cnblogs.com/bodboy/p/6015530.html clumsy 能在 Windows 平台下人工造成不稳定的网络状况,方便你调试应用程序在极端网络状况下的表现 ...
- Android -------- kotlin插件神器Json直接生成javaBean
这是一个data class从JSON字符串生成Kotlin 的插件,换句话说,是一个将JSON字符串转换为Kotlin data class(Json到Kotlin)的插件 在使用Kotlin进行开 ...
- Xamarin.FormsShell基础教程(6)Shell项目内容详情页面
Xamarin.FormsShell基础教程(6)Shell项目内容详情页面 轻拍内容列表页面中的任意一项内容后,进入内容详情页面,如图1.6和图1.7所示.该页面中显示了内容项的标题和具体内容.该页 ...