
单调队列&单调栈
constbh
这个作者很懒,什么都没留下…
展开
-
单调队列学习
单调队列就是一个维护递增或者递减元素的队列。当一个新的元素出现的时候,判断它与队尾元素的大小,不满足则出队,直到满足。再把新的元素压入队列。经典的例题是 poj2823.给一个序列和m,问这个序列所有长度为m的区间最大,最小值是多少。显然,如果暴力时间复杂度为O(N*m) 不超时就怪了。这题要在维护单调队列是保存答案,时间复杂度o(n)。开一个结构体存模拟队列,一个元素存值原创 2017-08-10 20:43:22 · 186 阅读 · 0 评论 -
51Nod 1349
继续学习单调栈! 利用单调栈求出数列中的每个数作为最大值的区间长度。#include#includeusing namespace std;const int maxn = 100005;typedef long long ll;int num[maxn];int sta[maxn];ll l[maxn],r[maxn];ll ans[maxn];//inline int i原创 2017-08-18 11:56:17 · 225 阅读 · 0 评论 -
poj2796(继续学习单调栈)
//可以开一个单调递增栈,对于每一个新元素a[i]//当前值小于等于栈顶元素,表示以栈顶元素为最小值的区间的右端是i//栈顶元素a[j]出栈 , 由于是单调递增栈,新的栈顶元素a[k]必然小于a[j],故需要更新新的栈顶元素的//右端值,新元素的左端的值也要更新为a[j]的左端//一直重复操作直到栈顶元素大于新元素//这样这个栈的每一个元素出栈时其左右区间必然是刚好最大的以该元原创 2017-08-23 11:03:42 · 307 阅读 · 0 评论 -
hdu3530(单调队列)
题意:有整数的序列。您的任务是找到满足以下条件的最长子序列:子序列的最大元素与最小元素之间的差值不小于m且不大于k。维护两个单调队列,一个最大,一个最小,然后根据两个队列队首元素的差值剔除队首元素。 然后更新最大长度。答案的初始值要为0,为1则wa,因为当一个元素时,最大,最小都是他,有可能不满足大于M的情况。#include#include#includeusing原创 2017-09-28 22:08:17 · 470 阅读 · 0 评论