P2698 [USACO12MAR]花盆Flowerpot——单调队列
记录每天看(抄)题解的日常;
https://www.luogu.org/problem/P2698
我们可以把坐标按照x递增的顺序排个序,这样我们就只剩下纵坐标了;
如果横坐标(l,r)区间,纵坐标的最大值减去最小值大于d,那么就可以更新答案;
看出随着l的增长,r一定是递增的;
可以证明不存在(l2,r2),l2>l1且r2<r,(maxy-miny)>d,且能对答案造成影响;
因为如果有这种存在,那么r2应该是l第一个匹配的对象,是更优的答案;
这就涉及到滑动窗口方法了;
用q1[]记录纵坐标最大值的位置,q2[]记录纵坐标最小值的位置;
范围是l到r;
更新队列区间范围:
while(h1<=t1&&q1[h1]<l) h1++;
while(h2<=t2&&q2[h2]<l) h2++;
更新r,最大值,最小值;
while(a[q1[h1]].y-a[q2[h2]].y<d&&r<n)
{
++r;
while(a[q1[t1]].y<a[r].y&&h1<=t1) t1--;
q1[++t1]=r;
while(a[q2[t2]].y>a[r].y&&h2<=t2) t2--;
q2[++t2]=r;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+;
int q1[maxn],q2[maxn],h1=,h2=,t1,t2;
int n,d;
struct node
{
int x,y;
}a[maxn];
bool cmp(node qw,node we)
{
return qw.x<we.x;
}
int ans=;
int main()
{
scanf("%d%d",&n,&d);
for(int i=;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
sort(a+,a+n+,cmp);
for(int l=,r=;l<=n;l++)
{
while(h1<=t1&&q1[h1]<l) h1++;
while(h2<=t2&&q2[h2]<l) h2++;
while(a[q1[h1]].y-a[q2[h2]].y<d&&r<n)
{
++r;
while(a[q1[t1]].y<a[r].y&&h1<=t1) t1--;
q1[++t1]=r;
while(a[q2[t2]].y>a[r].y&&h2<=t2) t2--;
q2[++t2]=r;
}
if(a[q1[h1]].y-a[q2[h2]].y>=d) ans=min(ans,a[r].x-a[l].x);
}
if(ans==) printf("-1");
else printf("%d",ans);
return ;
}
P2698 [USACO12MAR]花盆Flowerpot——单调队列的更多相关文章
- P2698 [USACO12MAR]花盆Flowerpot 单调队列
https://www.luogu.org/problemnew/show/P2698 警示 用数组写双端队列的话,记得le = 1, ri = 0:le<=ri表示队列非空 题意 求一个最小的 ...
- [USACO12MAR]花盆Flowerpot (单调队列,二分答案)
题目链接 Solution 转化一下,就是个单调队列. 可以发现就是一段区间 \([L,R]\) 使得其高度的极差不小于 \(d\) ,同时满足 \(R-L\) 最小. 然后可以考虑二分然后再 \(O ...
- luogu 2698 [USACO12MAR]花盆Flowerpot 单调队列
刷水~ Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in&quo ...
- P2698 [USACO12MAR]花盆Flowerpot(单调队列+二分)
P2698 [USACO12MAR]花盆Flowerpot 一看标签........十分后悔 标签告诉你单调队列+二分了............ 每次二分花盆长度,蓝后开2个单调队列维护最大最小值 蓝 ...
- 洛谷P2698 [USACO12MAR]花盆Flowerpot
P2698 [USACO12MAR]花盆Flowerpot 题目描述 Farmer John has been having trouble making his plants grow, and n ...
- [USACO12MAR]花盆 二分 单调队列
[USACO12MAR]花盆 二分 单调队列 存在一个长度为\(x\)的区间\([l,r]\),使得区间中最大值与最小值差至少为\(w\),求这个最小的\(x\) \(n\le 100000\),\( ...
- [P2698][USACO12MAR]花盆Flowerpot
Link: P2698 传送门 Solution: 对于可行区间$[L,R]$,随着$L$的递增$R$不会递减 因此可以使用尺取法来解决此题:不断向右移动左右指针,复杂度保持线性 同时为了维护区间内的 ...
- [USACO12MAR] 花盆Flowerpot
类型:二分+单调队列 传送门:>Here< 题意:给出$N$个点的坐标,要求根据$x$轴选定一段区间$[L,R]$,使得其中的点的最大与最小的$y$值之差$\geq D$.求$Min\{R ...
- luogu2698 [USACO12MAR]花盆Flowerpot
单调队列+二分答案 #include <algorithm> #include <iostream> #include <cstring> #include < ...
随机推荐
- mybatis - 问题记录
记录使用 mybatis 过程中遇到的一些报错,及原因以及解决方法. 1. 报错: Could not find parameter map com.lx.mapper.HotelMapper.map ...
- 【转载】Sqlserver存储过程中使用Select和Set给变量赋值
Sqlserver存储过程是时常使用到的一个数据库对象,在存储过程中会使用到Declare来定义存储过程变量,定义的存储过程变量可以通过Set或者Select等关键字方法来进行赋值操作,使用Set对存 ...
- FI-TCODE收集
主数据:FS00 编辑总帐科目FS01 创建主记录FS02 更改主记录FS03 显示主记录FS04 总帐科目更改(集中地 ...
- sql server 2012 分页/dapper/C#拼sql/免储存过程/简易
sql server 2012新特性, 支持 OFFSET/FETCH分页, 就像mysql的limit, 比之前的各种top舒服多了, 看各位大佬们的测评文章说效率也是不相上下的, 有时候写个小工 ...
- dubbo API的使用方式
本文使用maven方式 1:pom文件 <dependencies> <!-- 引入spring的jar --> <dependency> <groupId& ...
- c# 调试过程
- Oracle基础知识【1】
目录: 1.Oracle创建库.表 2.Oracle数据怎删查改操作 3.Oracle数据约束条件 Oracle创建库.表: create user user05 identified by 1234 ...
- K8S 1.12大特性最快最深度解析:Kubernetes CSI Snapshot(下)
Kubernetes CSI Snapshot(下篇) 目标目前在Kuberentes中,卷插件仅支持配置空的存储卷.随着新的存储功能(包括卷快照和卷克隆)的提出,因此需要支持配置卷时数据填充以.例 ...
- webpack中bundler源码编写
新建一个项目,再新建一个src文件夹,里面有三个文件,word.js,message.js,index.js word.js export const word = 'hello'; message. ...
- .NET Core、EF、Dapper、MySQL 多种方式实现数据库操作(动态注册实体类)
目录 前言 一.技术选型 二.遇到的坑 2.1..NET Core 下 EF 的问题 2.2.数据库实体类的注册 切记坑 前言 最近在学习.研究 .NET Core 方面的知识,动手搭建了一些小的 D ...