题目描述

给定n,k和一个长度为n的序列,求最长的最大值最小值相差不超过k的序列

输入格式

第一行两个有空格隔开的整数k(0<=k<=2000,000,000),n(1<=n<=3000,000),k代表设定的最大值,n代表序列的长度。第二行为n个由空格隔开的整数ai(1<=ai<=2000,000,000),表示序列。

输出格式

一个整数代表最大的符合条件的序列

首先解释一下题目:这道题让我们求出一个长度为n的序列中最长的一段子序列,满足这段子序列的最大值减最小值的差不超过k,求子序列的最大长度。
因为单调队列可以记录下一段区间的最大值和最小值,所以这道题我们完全可以用一个单调队列来实现。

我们设立一个l和r变量,分别表示子区间的左边界和右边界。接下来我们对任意一个子序列进行移动:
移动操作有两种情况,第一种即当该单调区间的最大值减去最小值的差小于等于k时,该单调区间是一个合法的区间。这时我们可以对答案进行记录,然后让r++,再进行判断是否会有更大的区间。

第二种情况,即当该单调区间的最大值减去最小值的差大于k时,该区间是一个不合法的区间。这时候我们不能将r++,因为这种操作不可能减小该区间内的最大值或增大该区间内的最小值,使变成一个合法的区间。我们只能将l++,然后注意要根据之前的a[l]和maxn,minn之间关系的三种情况对最大值和最小值进行维护。注意,单调队列是单调的,它只能往右移动,绝对不能出现往左移动的状况,即绝对不能l--或r--

这样我们就成功维护了单调队列的操作。

代码:

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int inf=0x3f3f3f3f;
4 int k,n,l,r,maxn,minn,ans;
5 int a[3000005];
6 void find(int l,int r){
7 maxn=-inf;minn=inf;
8 for(int i=l;i<=r;i++){
9 maxn=max(maxn,a[i]);
10 minn=min(minn,a[i]);
11 }
12 }
13 int main(){
14 cin>>k>>n;
15 for(int i=1;i<=n;i++){
16 cin>>a[i];
17 }
18 l=1;r=2;
19 maxn=max(a[1],a[2]);
20 minn=min(a[1],a[2]);
21 while(1){
22 if(maxn-minn>k){
23 if((a[l]==minn)||(a[l]==maxn)){
24 l++;
25 find(l,r);
26 }else if(a[l]>minn){
27 l++;
28 }
29 }else{
30 r++;
31 if(a[r]<minn){
32 minn=a[r];
33 }else if(a[r]>maxn){
34 maxn=a[r];
35 }
36 if(maxn-minn<=k){
37 ans=max(ans,r-l+1);
38 }
39 }
40 if(r==n){
41 break;
42 }
43 }
44 cout<<ans<<endl;
45 return 0;
46 }

P3512 [POI2010]PIL-Pilots 单调队列的应用的更多相关文章

  1. bzoj2096[Poi2010]Pilots 单调队列

    2096: [Poi2010]Pilots Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 983  Solved: 513[Submit][Statu ...

  2. BZOJ 2096: [Poi2010]Pilots 单调队列

    Code: #include<bits/stdc++.h> #define maxn 4000000 using namespace std; void setIO(string s) { ...

  3. BZOJ 2096 Pilots - 单调队列STL(deque)

    传送门 分析: 单调队列:维护两个递增.递减的队列,每次都加入新元素并更新,如果最大值(递减队首)-最小值(递增队首) > k,那么将最左段更新为前面两者中较前的那一个,并弹掉.用deque可以 ...

  4. 【BZOJ2096】[Poi2010]Pilots 双指针+单调队列

    [BZOJ2096][Poi2010]Pilots Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串, ...

  5. 【单调队列】bzoj2096 [Poi2010]Pilots

    用两个单调队列维护序列中的最大值和最小值即可. poi~ #include<cstdio> #include<algorithm> using namespace std; i ...

  6. bzoj2093: [Poi2010]Frog(单调队列,倍增)

    2093: [Poi2010]Frog Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 568  Solved: 186[Submit][Status] ...

  7. [POI2010]PIL-Pilots 单调队列

    [POI2010]PIL-Pilots 题意: 给定一个序列和一个数值k,求一段连续最大区间是的最大值与最小值之差小于k: 思路: 因为要维护最大值和最小值并且连续,使用两个单调队列分别同时维护最大最 ...

  8. bzoj1233 单调队列优化dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1233 数据结构优化dp的代码总是那么抽象 题意:奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Be ...

  9. POJ1821 单调队列//ST表 优化dp

    http://poj.org/problem?id=1821 当我们在考虑内层循环j以及决策k的时候,我们可以把外层变量i看作定值,以此来优化dp状态转移方程. 题意 有n个工人准备铺m个连续的墙,每 ...

  10. P3512 [POI2010]PIL-Pilots-洛谷luogu

    刚研究完单调队列和单调栈 于是就找题做了 发现了这道蓝题 以为很简单 就着手来写了 然而 并不是我想的那样 只是有一点点思路 无奈 还是看了题解 好吧题解是真的挺好的 ---------------- ...

随机推荐

  1. 【git】git子模块操作-从子模块的远端拉取上游修改 & 从项目远端拉取更改

    1.从子模块的远端拉取上游修改 1.1 在项目子模块目录中,运行git fetch与git merge更新本地代码 (1) 这种方法在获取子模块非master分支的更新时,没成功获取更新,没搞清楚原因 ...

  2. [Oracle19C 数据库管理] 管理PDB

    更改PDB的打开模式 RESTRICT模式 维护时使用,可以让只有RESTRICT权限的用户才能连接到数据库,其他用户无法连接. ALTER PLUGGABLE DATABASE 数据库名 CLOSE ...

  3. window向linux传递文件

    1.需要在window建一个ftp的server 2.在linux的指定目录下输入: curl ftp://192.168.98.90/libalgorithm.so -u "embftp: ...

  4. Zookeeper ZAB协议

    这篇博客是从源码的角度了解Zookeeper 从接收客户端请求开始,到返回数据为止,有很多涉及到的对象创建因为在前几篇文章已经说明过了,这里就不再重复的说明了,如果不是很明白的的,可以先看前几篇博文了 ...

  5. c++ 引用 指针。

    一.什么是引用(reference) ?已经存在的对象的另外一个名字. 引用有什么特别的? 1.引用在定义时,以&开头. 2.引用不是对象,只能绑定在对象上.所以必须在初始化的时候,指定引用绑 ...

  6. 防止react-re-render: Why Suspense and how ?

    近期内部项目基础项目依赖升级,之前使用的路由缓存不再适用,需要一个适配方案.而在此过程中react re-render算是困扰了笔者很久.后来通过多方资料查找使用了freeze解决了此问题.本文主要论 ...

  7. vue组件之间的传参

    vue组件之间传参有三种传参方式'父传子','子传父','非父子组件之间传值' 父传子 父组件 <template> <CounterCom :num="5"&g ...

  8. 多线程学习(第一天)java语言的线程

    一.并发与并行 并发:处理器不停的切换有操作的线程. 并行:多个处理器同时执行有操作线程. 二.启动线程 无论是A,B哪种方式实现多线程,都需要通过Thread.start方法启动线程. A.Thre ...

  9. spring-cloud-alibaba-dubbo踩坑记

    在https://start.aliyun.com/bootstrap.html下载了示例程序,用的版本如下: spring-boot:2.3.7.RELEASE spring-cloud-aliba ...

  10. ComPiler200002:Growing a Compiler

    http://www.cs.dartmouth.edu/~mckeeman/cs48/mxcom/gem/html/GrowingCompiler.html by Bill McKeeman and ...