![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
单调栈/单调队列
文章平均质量分 50
一种神器的数据结构
为什么他们cf写的这么快
这个作者很懒,什么都没留下…
展开
-
codeforces-817 D. Imbalanced Array(单调栈)
题目链接题意:给定一个数组,要你求数组中每个子序列的的最大值-最小值之和。思路:考虑每个数的贡献,每个数都会有作为最大值和最小值的时候,只有当a【i】在区间内最为最小值的时候,a【i】都会在最终答案里表示为-a【i】,最大值同理表示为+a【i】,所以思路就变成了求a【i】最为最小值和最大值的区间长度,这个用单调栈来求,L【i】代表a【i】左边第一个大于a【i】的数,R【i】代表a【i】右边第一个大于a【i】的数,于是a【i】最为最小值的区间就是(i-L【i】+1)*(R【i】-i+1),最大值同理。这原创 2021-10-21 15:32:45 · 316 阅读 · 0 评论 -
Looksery Cup 2015 F. Yura and Developers(单调栈+二分+分治)(难*)
题目链接题意:给定一个数组,问有多少区间满足:去掉最大值之后,和是k的倍数。思路:日后补。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e6+2;stack<int>s;ll ans,sum[maxn],l[maxn],r[maxn];ve...原创 2020-05-03 20:34:04 · 148 阅读 · 0 评论 -
Codeforces Round #189 (Div. 2) D. Psychos in a Line(单调队列+dp)
题目链接思路:dp【i】表示i这个被删除的次数,我们用单调队列来维护递增序列,当队列内元素小于a【i】时陆续弹出,在我左侧同时又被我弹出说明我肯定是在他们之后才被杀死的,所以这个过程dp维护一下就行。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+5;in...原创 2020-03-19 20:08:59 · 148 阅读 · 0 评论 -
Codeforces Round #305 (Div. 1) B. Mike and Feet(单调栈)
题目链接题意:给定一个数组,要你选连续x个数的最大值是多少?(一个数组的最大值定义为这个数组的元素的最小值)。思路:我们可以用单调栈来维护每个元素的连续区间长度,那么我们先考虑每个数前面的,如果栈内元素是1 2 5 6,现在的元素是4,那么很明显5和6都要被弹出去,那么这个时候包含了5和6这两个元素的区间长度他们的最小值是不是都可以变为4了呀,如果5的连续区间是1,6的连续区间是2,那么长度...原创 2020-03-19 20:19:22 · 96 阅读 · 0 评论 -
Codeforces Round #172 (Div. 1) B. Maximum Xor Secondary (单调栈)
题目链接题意:给定一个数组,定义一个区间【l,r】的值为这个区间的最大值异或次大值,求这个结果的最大值。思路:同样也是用单调栈来维护,对于弹出去的元素我们就认为它是当前区间的次大值。当不能再弹的时候,那么自己就是次大值了。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int ma...原创 2020-03-19 20:23:24 · 167 阅读 · 0 评论 -
Codeforces Round #401 (Div. 2) E. Hanoi Factory(单调栈+思维)
题目链接题意:给定n个物品,每个物品有三个属性ai、bi、hi(高度),当i和j满足aj<bi<=bj时i物品就可以放到j物品上面,求叠起来的最大高度。思路:一开始想复杂了,结果是个傻逼题,我们可以给bi从大到小排序,当某个bi<底下的aj时意味着bi后面的b都不可能再叠起来了,于是就要把他们弄出来,这个过程用单调栈来维护。#include<bits/stdc++....原创 2020-03-19 20:28:30 · 98 阅读 · 0 评论 -
Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)(单调栈)
题目链接思路:如果要满足题意的话构造出来的序列一定是一个峰的形式,可是我们不知道峰点在哪儿?那就一个个枚举峰点,left【i】表示在1-i中比a【i】小的数的前缀和,right【i】表示i到n的比a【i】小的数的前缀和,求出这两个数组我们就可以知道如果i为峰点的话序列和,取最大值就可以了,最后要注意到一下算以i为峰点的序列和的时候别忘了要减去a【i】,因为有算重复了。#include<...原创 2020-02-27 21:22:59 · 146 阅读 · 0 评论 -
Codeforces Round #574 (Div. 2) E. OpenStreetMap(单调队列)
题目链接思路:要想知道ab这个子矩阵最小的元素,我们可以维护两个单调队列,首先我们维护n行的单调队列q,每行单调队列存的就是每b个区间的最小值,当遍历到b列以后,我们再维护一个单调队列p,它维护的是这n行的q队列的队头元素每a个区间的最小值,如此ab子矩阵的最小就得出来了。#include<bits/stdc++.h>using namespace std;typedef l...原创 2020-02-27 21:39:59 · 101 阅读 · 0 评论 -
Codeforces Global Round 5 D. Balanced Playlist(单调队列)
题目链接#include <bits/stdc++.h>using namespace std;const int maxn=3e5+1;int n,a[maxn],q[maxn],ans[maxn],vis[maxn],maxx=0,minn=1e9+100;int main(){ scanf("%d",&n); for(int i=1;i<=n;+...原创 2020-02-21 21:28:24 · 171 阅读 · 0 评论 -
Codeforces Round #618 (Div. 1) C. Water Balance(思维+单调栈)
题目链接题意:给出n个数,每次可以选任意区间,把这个区间的所有数都变成平均数,问怎么变能使得整个数组的字典序最小。。思路:很明显,我们要先字典序最小的话首先要想办法把前面大的数给降下来,就是通过后面小的数一平均就可以降下来了,我们可以从后往前遍历,每次把变成平均数的那一段看成一个整体,维护一下就行。size存的是从当前为开始作为一整体的区间下标,意思也就是比如i=3和j=6是一个整体,那么...原创 2020-02-10 21:49:26 · 176 阅读 · 0 评论