单调栈
wtcl
这个作者很懒,什么都没留下…
展开
-
Discrete Centrifugal Jumps CodeForces - 1407D(单调栈拓展)
这道题让我对单调栈的功能有了新的认识。。。我以前还以为单调栈只能求一个数前面第一个比他大/小的数 首先定义dp[i]:当前共有i栋楼表示到第i栋楼的最小步数。 根据条件有如下转移: 1.dp[i]=dp[i-1]+1; 2.i前面有一个下标假设为j,且这个j满足(a[j]>max(a[j+1]…,a[i-1]); dp[i]=dp[j]+1; 3.i前面有一个下标假设为j,且这个j满足(a[j]<min(a[j+1]…a[i-1]);dp[i]=dp[j]+1; 条件1很好转移,条件2和3类似,原创 2020-09-09 21:46:51 · 158 阅读 · 0 评论 -
杭电多校一 Leading Robots HDU - 6759(单调栈拓展)
1.假设 a,b,c,d,e 为最终结果的序列(a,b,c,d,e按照位置从大到小,每个机器人都当过leader),则c超过b的时间小于b超过a的时间,d超过c的时间小于b超过a的时间,两个机器人之间的时间是严格减少的。单调栈最后栈中元素就满足从大到小。 2.很明显每个机器人后边加速度比他小的点不可能成为leader,把这些点去掉,把剩余的点按照位置从大到小排序,会发现这些点的加速度是按照从小到大排列的。(做的时候只需要将所有机器人按位置从大到小排序,然后遍历一遍,把加速度比前面小的去掉就可以) 3.机器人原创 2020-07-22 20:42:57 · 117 阅读 · 0 评论 -
单调栈 单调队列
单调栈:给定一个数组,求一个数左边/右边第一个比他大/小的数 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<stack> using namespace std; const int N=1e5+100; int a[N]; int main() { int n; scanf("%d",&n); stack<i原创 2020-07-21 23:46:57 · 72 阅读 · 0 评论 -
Largest Submatrix of All 1’s POJ - 3494(单调栈)
1.刚开始只是求得左边比他小的点,后来发现我这种求法求的是以s[i][j]为右端点且该矩形高是d[i][j]的最大面积,这样不全面。 2.应该求的是以d[i][j]作为矩形的高求最大面积,需要求每个点两边离它最近的比它小的点,这样才能做到不重不漏。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<stack> using names原创 2020-07-07 19:18:09 · 78 阅读 · 0 评论 -
Mike and Feet CodeForces - 548D(单调栈)
题意: 给定一组长度为n的序列a[1],a[2]…a[n](n<=2e5,a[i]<=1e9),现在对于任意一个区间长度len(1<=len<=n),要求长度为len的连续子序列中最小值的最大值是多少,比如一个序列n=5,序列元素为2,3,6,4,1,那么当长度为2时答案就是4,即子序列{a[3],a[4]}中的最小值 思路: 1.求出每个数作为最小值的最大区间(求出这个数两边比它大的最近的数的坐标) 2.从后往前遍历,如果ans[i]<ans[i+1] ans[i+1]=an原创 2020-07-07 16:06:39 · 119 阅读 · 0 评论 -
Bad Hair Day (单调栈)
单调栈:o(n)求每个数左边/右边离它最近的大于/小于它的数(坐标) 思路: 1.求每个数右边大于等于它的最近的坐标 2.一个数右边比他小的数对于前边的数没有用 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<stack> #define ll long long using namespace std; const int原创 2020-07-05 17:15:08 · 110 阅读 · 0 评论