洛谷原题链接:https://www.luogu.com.cn/problem/P2698

P2698 [USACO12MAR] Flowerpot S

题目描述

老板需要你帮忙浇花。给出 \(N\) 滴水的坐标,\(y\) 表示水滴的高度,\(x\) 表示它下落到 \(x\) 轴的位置。

每滴水以每秒 \(1\) 个单位长度的速度下落。你需要把花盆放在 \(x\) 轴上的某个位置,使得从被花盆接着的第 \(1\) 滴水开始,到被花盆接着的最后 \(1\) 滴水结束,之间的时间差至少为 \(D\)。

我们认为,只要水滴落到 \(x\) 轴上,与花盆的边沿对齐,就认为被接住。给出 \(N\) 滴水的坐标和 \(D\) 的大小,请算出最小的花盆的宽度 \(W\)。

输入格式

第一行 \(2\) 个整数 \(N\) 和 \(D\)。

接下来 \(N\) 行每行 \(2\) 个整数,表示水滴的坐标 \((x,y)\)。

输出格式

仅一行 \(1\) 个整数,表示最小的花盆的宽度。如果无法构造出足够宽的花盆,使得在 \(D\) 单位的时间接住满足要求的水滴,则输出 \(-1\)。

输入输出样例 #1

输入 #1

4 5
6 3
2 4
4 10
12 15

输出 #1

2

说明/提示

【样例解释】

有 \(4\) 滴水,\((6,3)\),\((2,4)\),\((4,10)\),\((12,15)\)。水滴必须用至少 \(5\) 秒时间落入花盆。花盆的宽度为 \(2\) 是必须且足够的。把花盆放在 \(x=4\dots6\) 的位置,它可以接到 \(1\) 和 \(3\) 水滴,之间的时间差为 \(10-3=7\) 满足条件。

【数据范围】

\(40\%\) 的数据:\(1 \le N \le 1000\) ,\(1 \le D \le 2000\)。

\(100\%\) 的数据:\(1 \le N \le 10 ^ 5\),\(1 \le D \le 10 ^ 6\),\(0\le x,y\le10^6\)。

思路:

创建两个单调队列,一个维护窗口中最大值,一个维护窗口中最小值,由于水滴的x坐标不是连续的,所以进行离散化处理,然后将水滴的x坐标从小到大排序,每次循环左边界移动一位,有边界找到符合条件的最小右边界,按照单调队列的流程,更新区间的最大值和最小值,如果符合条件跳出循环,下面再进行判断一次,避免出现r已经处于n-1位置的情况下,无法继续移动,使得条件成立,错误更新答案的情况,每次更新取min,每次循环结束更新一次左边界

题解:

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
int n,d;
struct water
{
int x,y;
}wa[N]; bool cmp(water a,water b)
{
return a.x<=b.x;
} int mindq[N];
int maxdq[N]; int mint,minh,maxh,maxt; bool ok()
{
int maxnum = maxt>maxh?wa[maxdq[maxh]].y:0;
int minnum = mint>minh?wa[mindq[minh]].y:0;
return maxnum-minnum>=d;
} void push(int r)
{
while(maxh<maxt&&wa[maxdq[maxt-1]].y<=wa[r].y)
{
maxt--;
}
maxdq[maxt++]=r;
while(minh<mint&&wa[mindq[mint-1]].y>=wa[r].y)
{
mint--;
}
mindq[mint++]=r;
} void pop(int l)
{
if(maxh<maxt&&maxdq[maxh]==l)maxh++;
if(minh<mint&&mindq[minh]==l)minh++;
} int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>d;
for(int i=0;i<n;i++)cin>>wa[i].x>>wa[i].y;
sort(wa,wa+n,cmp);
// for(int i=0;i<n;i++)cout<<wa[i].x<<' '<<wa[i].y<<endl;
int ans = INT_MAX;
for(int l=0,r=0;l<n;l++)
{
while(!ok()&&r<n)
{
push(r++);
}
if(ok())ans = min(ans,wa[r-1].x-wa[l].x);
pop(l);
}
if(ans==INT_MAX)cout<<-1<<endl;
else cout<<ans<<endl; return 0;
}

P2698 [USACO12MAR] Flowerpot S (单调队列、离散化)的更多相关文章

  1. 洛谷P2698 花盆Flowerpot【单调队列】

    题目描述 Farmer John has been having trouble making his plants grow, and needs your help to water them p ...

  2. [USACO12MAR]花盆 二分 单调队列

    [USACO12MAR]花盆 二分 单调队列 存在一个长度为\(x\)的区间\([l,r]\),使得区间中最大值与最小值差至少为\(w\),求这个最小的\(x\) \(n\le 100000\),\( ...

  3. P2698 [USACO12MAR]花盆Flowerpot(单调队列+二分)

    P2698 [USACO12MAR]花盆Flowerpot 一看标签........十分后悔 标签告诉你单调队列+二分了............ 每次二分花盆长度,蓝后开2个单调队列维护最大最小值 蓝 ...

  4. Flowerpot(单调队列)

    描述 Farmer John has been having trouble making his plants grow, and needs your help to water them pro ...

  5. P2698 [USACO12MAR]花盆Flowerpot 单调队列

    https://www.luogu.org/problemnew/show/P2698 警示 用数组写双端队列的话,记得le = 1, ri = 0:le<=ri表示队列非空 题意 求一个最小的 ...

  6. [USACO12MAR]花盆Flowerpot (单调队列,二分答案)

    题目链接 Solution 转化一下,就是个单调队列. 可以发现就是一段区间 \([L,R]\) 使得其高度的极差不小于 \(d\) ,同时满足 \(R-L\) 最小. 然后可以考虑二分然后再 \(O ...

  7. 洛谷P2698 [USACO12MAR]花盆Flowerpot

    P2698 [USACO12MAR]花盆Flowerpot 题目描述 Farmer John has been having trouble making his plants grow, and n ...

  8. [P2698][USACO12MAR]花盆Flowerpot

    Link: P2698 传送门 Solution: 对于可行区间$[L,R]$,随着$L$的递增$R$不会递减 因此可以使用尺取法来解决此题:不断向右移动左右指针,复杂度保持线性 同时为了维护区间内的 ...

  9. Easy Climb UVA - 12170 滚动dp +离散化+ 单调队列优化

    E.Easy Climb Somewhere in the neighborhood we have a very nice mountain that gives a splendid view o ...

  10. bzoj 1171 大sz的游戏& 2892 强袭作战 (线段树+单调队列+永久性flag)

    大sz的游戏 Time Limit: 50 Sec  Memory Limit: 357 MBSubmit: 536  Solved: 143[Submit][Status][Discuss] Des ...

随机推荐

  1. 用C#将多个jpg合成一个pdf

    nuget安装iTextSharp: static void MergePDF(string picPath,string pdfPath) { string[] picFileNames=Direc ...

  2. C++ ADL 与 模板

    什么是ADL ADL(Argument Dependent Lookup),参数依赖查找,明确的意思是依赖参数的函数查找,即对于函数调用,不仅会依照常规的名称查找规则,还会在函数参数所在的命名空间内查 ...

  3. 通过node.js安装yarn

    如果你已经装好了node,那么 1.添加repo curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /e ...

  4. CountDownLatch和FutureTask类使用方法解析

    摘要:使用CountDownLatch和FutureTask解决主线程需要拿到多个子线程任务的执行结果之后再进行执行的问题. 综述   我们在工作中,经常遇到有些业务场景需要使用多线程异步执行任务,从 ...

  5. kali在apt update报错提示没有公钥

    提示代码如下: ─# apt update 获取:1 http://mirrors.ustc.edu.cn/kali kali-rolling InRelease [41.5 kB] 错误:1 htt ...

  6. 双 CDN 加速 + 智能调度

    转载自我的个人博客:双 CDN 加速 + 智能调度 |未名小站 DeepSeek 的官网是一个很典型的双 CDN 加速的场景,当我们使用 IT-Dog 对其发起多地 Ping 的时候,可以看到国内使用 ...

  7. 详解鸿蒙Next仓颉开发语言中的动画

    大家上午好,今天来聊一聊仓颉开发语言中的动画开发. 仓颉中的动画通常有两种方式,分别是属性动画和显示动画,我们今天以下面的加载动画为例,使用显示动画和属性动画分别实现一下,看看他们有什么区别. 显示动 ...

  8. pytorch入门 - AlexNet神经网络

    AlexNet背景 AlexNet是2012年由Alex Krizhevsky.Ilya Sutskever和Geoffrey Hinton提出的深度卷积神经网络架构. 它在ImageNet大规模视觉 ...

  9. Spring用到的10种设计模式,真巧妙!

    前言 作为一名有多年开发经验的老司机,每次翻看Spring源码都让我感叹:"这哪是框架,分明是设计模式的百科全书!" 有些小伙伴在工作中可能只会用@Autowired,却不知背后藏 ...

  10. [2025.3.9~2025.3.15 鲜花/省选后记/rain] ほら逃げられないわ

    [2025.3.9~2025.3.15 鲜花/省选后记] ほら逃げられないわ 堪称大型sm游戏的whk学习... 省选完后要补whk,一开始说的是网课,后面返校那天班主任说是线下课,那咋受得了的啊,加 ...