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 ...
随机推荐
- 使用docker部署微服务
https://my.oschina.net/silenceyawen/blog/1819472 http://jvm123.com/2019/08/docker-shi-yong.html 从201 ...
- luogu P1550 [USACO08OCT]打井Watering Hole
题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pastur ...
- SpringMVC相关试题
1.下列相关Spring自动装配的说法中,错误的是( ). (选择一项) A:在Spring配置文件中,可以通过<bean>元素的autowire属性指定自动装配方式B: autowire ...
- Python中近期Pandas使用总结
近期做了很多关于数据处理的问题,发现灵活运用pandas包对于数据分析来说可以轻松好多 导包 import numpy as npimport pandas as pdfrom pandas impo ...
- Mongoose 入门以及实现数据的增、删、改、查
mongoose 介绍 Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具.Mongoose 是 NodeJS 的驱动,不能作为其他语言的驱动. Mong ...
- cloudstack 安装 install for ubuntu
准备工作环境信息 修改dns配置 设置阿里源root@sh-saas-cs-manager-online-01:~# mv /etc/apt/sources.list /etc/apt/sources ...
- elasticsearch-py 解决 too_long_frame_exception 问题
elasticsearch-py 解决 too_long_frame_exception 问题 老大让我搞一搞数据统计,配环境时遇到个奇葩错误,记录一下,希望能帮助到某些人. 我需要安装 Elasti ...
- mysql注入写文件
select * from admin where id =-1 union select 1,'<?php phpinfo();?>',3,4 into outfile 'c:\\1.p ...
- Server Tomcat v8.5 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
Server Tomcat v9.0 Server at localhost was unable to start within 45 seconds. If the server requires ...
- KCP TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间)
http://www.skywind.me/blog/archives/1048 KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降 ...