单调队列 BZOJ 2096 [Poi2010]Pilots

2096: [Poi2010]Pilots

Time Limit: 30 Sec  Memory Limit: 162 MB
Submit: 819  Solved: 418
[Submit][Status][Discuss]

Description

Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值。耍畸形一个人是不行的,于是他找到了你。

Input

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

Output

输出:最大的字串长度。

Sample Input

3 9

5 1 3 5 8 6 6 9 10

Sample Output

4

(有两个子串的长度为4: 5, 8, 6, 6 和8, 6, 6, 9.最长子串的长度就是4)

水题一道

从左到右枚举右端点,利用单调队列维护当前区间中的最大值和最小值

如果某一时刻当前区间的最大值和最小值之差超过了k,就向右调整左端点直到差小于等于k为止

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,k,h1,h2,t1,t2,temp=1,ans;
 7 int in[3000010],l1[3000010],l2[3000010];
 8 int main(){
 9     scanf("%d%d",&k,&n);
10     for(int i=1;i<=n;i++) scanf("%d",&in[i]);
11     for(int i=1;i<=n;i++){
12         while(h1<t1&&in[i]<=in[l1[t1-1]]) t1--;
13         while(h2<t2&&in[i]>=in[l2[t2-1]]) t2--;
14         l1[t1]=l2[t2]=i;
15         t1++;t2++;
16         while(in[l2[h2]]-in[l1[h1]]>k)
17             if(l2[h2]>l1[h1])  temp=l1[h1]+1,h1++;
18             else temp=l2[h2]+1,h2++;
19         ans=max(ans,i-temp+1);
20     }
21     printf("%d",ans);
22     return 0;
23 }
时间: 2024-10-06 15:22:08

单调队列 BZOJ 2096 [Poi2010]Pilots的相关文章

BZOJ 2096 Poi2010 Pilots 单调队列

题目大意:给定一个序列,求一个最长的子串,使最大值与最小值之差不超过k 从左到右枚举右端点,利用单调队列维护当前区间中的最大值和最小值 如果某一时刻当前区间的最大值和最小值之差超过了k,就向右调整左端点直到差小于等于k为止 时间复杂度O(n) #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 3003003 using namespa

BZOJ 2096: [Poi2010]Pilots

Description 求一个最长的序列,最大值最小值之差不超过 \(k\) . Sol 单调队列. 一个队列直接上就行.. Code /************************************************************** Problem: 2096 User: BeiYu Language: C++ Result: Accepted Time:4024 ms Memory:71604 kb ********************************

【单调队列】bzoj2096 [Poi2010]Pilots

用两个单调队列维护序列中的最大值和最小值即可. poi~ #include<cstdio> #include<algorithm> using namespace std; int m,n,head[2]={1,1},tail[2]={1,1},q[2][3000001],a[3000001],ans; int main() { scanf("%d%d",&m,&n); for(int i=1;i<=n;++i) scanf("%

2096: [Poi2010]Pilots单调队列题解

Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是不行的,于是他找到了你. Input 输入:第一行两个有空格隔开的整数k(0<=k<=2000,000,000),n(1<=n<=3000,000),k代表Tz设定的最大值,n代表难度序列的长度.第二行为n个由空格隔开的整数ai(1<=ai<=2000,000,000),表

[树形dp][Tarjan][单调队列] Bzoj 1023 cactus仙人掌图

Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌 图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说,上面的第一个例子是一张仙人图,而第二个不是——注意到它有三条简单回路:(4,3,2,1,6 ,5,4).(7,8,9,10,2,3,7)以及(4,3,7,8,9,10,2,1,6,5,4),而(2,3)同时出现在前两 个的简单回路里.另外,第三张图也不是仙人图,因为它并不是连通图

bzoj2096[Poi2010]Pilots 单调队列

2096: [Poi2010]Pilots Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 983  Solved: 513[Submit][Status][Discuss] Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是不行的,于是他找到了你. Input 输入:第一行两个有空格隔开的整数k(0

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

[BZOJ2096][Poi2010]Pilots Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是不行的,于是他找到了你. Input 输入:第一行两个有空格隔开的整数k(0<=k<=2000,000,000),n(1<=n<=3000,000),k代表Tz设定的最大值,n代表难度序列的长度.第二行为n个由空格隔开的整数ai(1&

BZOJ 1855 股票交易(单调队列优化DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1855 题意:最近lxhgww又迷上了投资股票, 通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每 个i,都有APi>=BPi),但是每天不能无限制地交易,于是股票交易所规定第i天的一次买入至多只能购买ASi股,一次卖出至多只能卖出BS

【bzoj 1414】对称的正方形 单调队列+manacher

Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵.通过观察,Orez发现这些数据蕴涵了一个奇特的数,就是矩阵中上下对称且左右对称的正方形子矩阵的个数. Orez自然很想知道这个数是多少,可是矩阵太大,无法去数.只能请你编个程序来计算出这个数. Input 文件的第一行为两个整数n和m.接下来n行每行包含m个正整数,表示Orez得到的矩阵. Output 文件中仅包含一个整数answer