[USACO12MAR] 花盆Flowerpot
类型:二分+单调队列
传送门:>Here<
题意:给出$N$个点的坐标,要求根据$x$轴选定一段区间$[L,R]$,使得其中的点的最大与最小的$y$值之差$\geq D$。求$Min\{R-L\}$
解题思路
一道单调队列的好题
思想依然是转化。我们熟知的单调队列的作用也就是滑动窗口——定长区间滚动最大最小值
但是现在区间长度不固定。容易发现,答案满足单调性的,于是可以二分答案。那么问题就转化为定长区间了。然后维护两个单调队列分别做最大与最小值即可
Code
/*By DennyQi 2018.8.18*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define r read()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
const int MAXN = ;
const int INF = ;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x<<) + (x<<) + c - '', c = getchar();return x * w;
}
struct Coordinate{
int x, y;
}a[MAXN];
int N,D,L,R,Mid,Ans,h1,h2,t1,t2;
int qmax[MAXN],qmin[MAXN];
inline bool cmp(const Coordinate& a, const Coordinate& b){
return a.x < b.x;
}
inline bool judge(int len){
h1 = h2 = , t1 = t2 = ;
qmax[] = qmin[] = ;
for(int i = ; i <= N; ++i){
while(h1 <= t1 && a[i].y > a[qmax[t1]].y){
--t1;
}
qmax[++t1] = i;
while(h2 <= t2 && a[i].y < a[qmin[t2]].y){
--t2;
}
qmin[++t2] = i;
while(h1 <= t1 && a[i].x - a[qmax[h1]].x > len){
++h1;
}
while(h2 <= t2 && a[i].x - a[qmin[h2]].x > len){
++h2;
}
if(a[qmax[h1]].y - a[qmin[h2]].y >= D) return ;
}
return ;
}
int main(){
N = r, D = r;
for(int i = ; i <= N; ++i){
a[i].x = r, a[i].y = r;
}
sort(a+, a+N+, cmp);
Ans = -;
L = , R = 1e6+;
while(L <= R){
Mid = (L + R) / ;
if(judge(Mid)){
R = Mid - ;
Ans = Mid;
}
else{
L = Mid + ;
}
}
printf("%d", Ans);
return ;
}
[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个单调队列维护最大最小值 蓝 ...
- [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表示队列非空 题意 求一个最小的 ...
- LuoguP2698 【[USACO12MAR]花盆Flowerpot】
题目描述 首先我们简化一下题意: 要找一段区间[L,R],使区间[L,R]内元素最大值减最小值大于等于D. 做法: 首先很容易想到采用二分,分什么呢? 我们二分区间长度为mid 这个时候,检验就成为了 ...
- 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 ...
随机推荐
- Windows Community Toolkit 3.0 - Gaze Interaction
概述 Gaze Input & Tracking - 也就是视觉输入和跟踪,是一种和鼠标/触摸屏输入非常不一样的交互方式,利用人类眼球的识别和眼球方向角度的跟踪,来判断人眼的目标和意图,从而非 ...
- 朱晔的互联网架构实践心得S1E1:Pilot
朱晔的互联网架构实践心得S1E1:Pilot 最近几年写博客确实写得少了,初出茅庐的时候什么都愿意去写,现在写一点东西之前会反复斟酌是否有价值.工作十几年了,做了N多个互联网系统,业务涉及教育.游戏. ...
- Bootstrap 栅格 样式 组件 插件
-----------------------------起先是我们造成习惯,后来是习惯造成我们. day 51 Bootstrap 官方网站: bootcss.com/ <!DOCTYP ...
- Python异常处理try except
原文地址:https://www.cnblogs.com/init-life/p/9105546.html 异常处理try except 在Python中,异常处理,主要是try except语句,通 ...
- Dijkstra的应用
每次只涉及一边两端点的极值循环转移应用Dijkstra.
- BZOJ4289 Tax 最短路建模
给定一个带边权的无向图,求1到n的最小代价路径.经过一个点的代价是路径上这个点的入边和出边的较大权值. \(n \le 100000, m \le 200000\). 一般的建图是考虑每个点,其入边和 ...
- pycharm设置pytest运行程序
- 记第一次多用户在Git提交代码
今天第一次进行了多用户(其实就两人)在自建Git服务器提交代码. 先记录碰到的问题:首先是本地提交代码时,进行了add,commit后,在push时碰到服务器故障,待设置好服务器后,再push时,却p ...
- CodeIgniter框架通过URL向控制器传递参数
通过URL传递参数的方法是GET,在CodeIgnter框架中,通过URL有两种方式向控制器传递参数: 一种是键值对的形式. 一种是类似于文件路径的形式,这个时候,不是以键值对的形式了,我们只传递值. ...
- Java.lang.OutOfMemoryError:Metaspace
Understand the OutOfMemoryError Exceptionhttps://docs.oracle.com/javase/8/docs/technotes/guides/trou ...