求最大子区间,是差值在m与k之间【单调队列】
来源:互联网 发布:网络电视能不能看直播 编辑:程序博客网 时间:2024/05/29 17:13
假设当前子序列是合法的,读入的新值后合法,那么最有解更新,如果读入后不合法,显然这种不合法一定是差值大于k,而不是小于m,因为之前是合法的,如果大于k,那么区间左值就要向右移动,然后要判断单调队列是否因为s增加而要取消最大值,如果出现,那么差值就会小于k,如果也大于m,就更新最优解
假设当前状态不合法,大于k的按上面的处理,小于m的,就读入新字符。
using namespace std;
const int maxn=100005;
int n,m,k;
int a[maxn];
int pmax[maxn],qmax[maxn],pmin[maxn],qmin[maxn];
int lmax,rmax,lmin,rmin;
int main()
{
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int s=0;//区间左值
int ans=0;
lmax=rmax=lmin=rmin=0;
for(int i=0;i<n;i++){
while(lmax<rmax&&a[i]>qmax[rmax-1])rmax--;
qmax[rmax]=a[i];
pmax[rmax++]=i;
while(lmin<rmin&&a[i]<qmin[rmin-1])rmin--;
qmin[rmin]=a[i];
pmin[rmin++]=i;
if(qmax[lmax]-qmin[lmin]<m)continue;
while(qmax[lmax]-qmin[lmin]>k){
s++;
if(pmax[lmax]<s)lmax++;
if(pmin[lmin]<s)lmin++;
}
if(i-s+1>ans){
ans=i-s+1;
}
}
printf("%d\n",ans);
}
return 0;
}
0 0
- 求最大子区间,是差值在m与k之间【单调队列】
- HDU 4123 (树的直径+单调队列求差值小于等于k的最长子区间)
- HDU 3530 Subsequence(区间最值差>=m且<=k的最大长度、双单调队列)
- hdu3415 单调队列求区间最大和
- 【hdu3415】【单调队列 】Max Sum of Max-K-sub-sequence【求长度不大于k的区间最大子串和】
- 长度不超过k的最大连续子序列(单调队列)
- hdu5289RMQ求区间最大最小值和单调队列维护区间最大最小值
- 线段树--求区间最大差值
- 给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间的最大差值M,要求设计线性的时间算法
- 【HDU3530】【单调队列(双)】Subsequence 【长度为n的数列,求最长子区间的长度,使得区间的最大值与最小值的差满足一个范围】
- 【二维单调队列】FZU- Problem 2080 最大差值
- 长度不超过m的最大连续子序列(dp + 单调队列)
- 单调队列(求区间最值)
- Sliding Window(单调队列维护或线段树求区间最大最小值)
- poj 2823 单调队列 (求特定长度区间的最大最小值)
- 单调队列求第k大值
- 单调队列之求最大和
- HDU 3415 Max Sum of Max-K-sub-sequence(长度不超过k的最大连续子序列和,单调队列)
- OC学习笔记(7)多重继承下的消息传递
- 常用正则表达式大全!
- Android Studio 安装使用遇到的问题
- PHP基础笔记(2)
- 在IOS设备上演示axure原型
- 求最大子区间,是差值在m与k之间【单调队列】
- USB On-The-Go引脚 说明
- 澳门回归十五年 中华通助力两岸民众巧交流
- Tor 2
- C#——数据翻页
- USB OTG驱动分析(一)
- C的xml编程-libxml2
- 在Oracle中查询表的大小和表空间的大小
- C++中的抽象类以及接口的区别联系