单调栈-队列-ST
ID_BePosit
如果今天不比昨天多做一点什么,那么明天还有什么意义。
展开
-
Maximum of Maximums of Minimums -RMQ
B - Maximum of Maximums of Minimums 题意: 把长度为n的序列划分为k部分,取每一部分的最小值,最小值中取最大, 求切分方法使得最后的值最大 RMQ转自原文:https://blog.csdn.net/qq_31759205/article/details/75008659?utm_source=copy DP[]数组从i起连续2<&l...原创 2018-10-11 18:29:35 · 216 阅读 · 0 评论 -
E - Largest Rectangle in a Histogram POJ - 2559 -单调栈第二弹
E - Largest Rectangle in a Histogram POJ - 2559 维护一个非严格的单调递增的单调栈,对于每个矩形,我们求出它向左向右分别能延伸的长度,然后乘以它的高度。 这就是以当前矩形为最低高度可以得到的最大的面积。只需要求个最大值即可。 总结性的来说就是:给定一序列,寻找某一子序列,使得子序列中的最小值乘以子序列的长度最大。 #i...原创 2018-11-29 17:18:03 · 161 阅读 · 0 评论 -
E - Largest Submatrix of All 1’s POJ - 3494 -单调栈-第三弹
E - Largest Submatrix of All 1’s POJ - 3494 题目大意:找一个全部是1的最大子矩阵 解题思路:https://blog.csdn.net/zuzhiang/article/details/78136417 #include<stack>#include<stdio.h>using namespace std;...原创 2018-11-29 18:23:21 · 202 阅读 · 0 评论 -
1086 背包问题 V2-多重背包-深度理解
1086 背包问题 V2 先来一发无任何优化的: for (int i=1; i<=n; i++) f[i][0]=0; for (int j=w[i]; j<=v; j++) int count=min(num[i],j/w[i]); ...原创 2018-12-04 18:27:19 · 256 阅读 · 0 评论 -
Problem A. Ascending Rating HDU - 6319 -单调队列
Problem A. Ascending Rating HDU - 6319 给定一个序列 a[1..n],对于每个长度为 m 的连续子区间, 求出区间 a 的最大值。 以及从左往右扫描该区间时 a 的最大值的 变化次数。 1 ≤ m ≤ n ≤ 1e7 逆向进行单调队列维护最大值,(i—i+m-1)序列内的最大值,此时合法区间单调队列中元素的个数就是最值改变次数。...原创 2018-12-18 17:13:30 · 180 阅读 · 0 评论 -
Mr. Panda and Strips Gym - 101194C -尺取
Mr. Panda and Strips Gym - 101194C 题意:现在要找到数列中连续两个子序列(没有公共部分)。要求这两个子序列本身内部没有重复出现的数。 求这两个子序列的长度的和的最大值。 思路:首先对于尺取的L与R,再次尺取0到L与R到N,从中选择一段最长的连续序列,每次更新即可 #include<bits/stdc++.h>using n...原创 2018-12-18 17:13:12 · 400 阅读 · 0 评论 -
1275 连续子段的差异-单调队列-序列最值差
1275 连续子段的差异 题意:询问 最值差不超过k的连续子序列的个数 思路:两个单调队列,一个维护单调增,一个维护单调减,从前往后遍历序列,维护的含义为以当前i为终点 的最长合法子序列,那么这段最长子序列中以i为终点的小子序列的个数自然就是 这段最长序列的长度 长度的计算是,让不满足题意的最大最小值,靠左的那个出队,让留下的尽可能长,不要漏掉情况 然后长度计算本来是序列 : 右...原创 2018-12-04 09:12:20 · 433 阅读 · 0 评论 -
D2. Great Vova Wall (Version 2)-单调栈
单调栈:最基础的应用、针对每个数,寻找它和它右边第一个比它大的数之间有多少个数。 题意:有n堆相邻的砖,每堆都有一个高度,你可以在相邻的两堆中放一个1*2的砖使它们高度都加一 (要求相邻两堆高度必须相同)。输出可不可以让最后n堆砖有相同高度。(很明显是copy的zyl的) 思路:eemm除了最高的那个高度的砖不需要处理别的,都得往上垒砖,那就看一下这个数左边小于等于他的 与右边小于等于它的...原创 2018-12-19 16:25:54 · 250 阅读 · 0 评论 -
P2216 [HAOI2007]理想的正方形-二维单调队列
题意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域。 使得该区域所有数中的最大值和最小值的差最小。 思路:先用单调队列维护行,得到两个新的矩阵,每个点的含义是从此处往后k个的最大值(或最小值)。 在对这两个新的矩阵进行列单调队列维护最值得到两个新的矩阵此时每个点的含义就是从此处开始的大小n*n的区域内的 最大值(最小值)。最后暴力枚举一下求一个最值差最小即可。 ...原创 2018-12-18 17:13:59 · 317 阅读 · 0 评论 -
B - Sticks Problem POJ - 2452 -二分答案-RMQ预处理
B - Sticks Problem POJ - 2452 题意: 给出一个数组a,求最大的j-i满足 i<j && a[i] ... a[j]中最大值为a[j],最小值为a[i]。 思路: 可以枚举左标位置i,然后二分找出满足的最远的j,只需要满足在i-j区间内最小值是a[i]即可,需要RMQ查询最小值验证。 原因是随着区间变大区间最小值会变小或不变...原创 2018-12-20 20:04:12 · 269 阅读 · 0 评论 -
P1419 寻找段落 -二分答案-单调队列
P1419 寻找段落 题意:给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值。现在需要找出序列中最有价值的“段落”。 段落的定义是长度在[S,T]之间的连续序列。最有价值段落是指平均值最大的段落, 段落的平均值=段落总价值/段落长度。 思路:我们将a全部减去mid,问题转化为判断是否存在一个长度在s~t范围内的区间它的和为正。 如果有说明还有更大的平均值。用前缀和单调队列维...原创 2018-12-18 17:13:43 · 417 阅读 · 0 评论 -
D - Bad Hair Day POJ - 3250 -单调栈-第一弹
单调栈是什么: 单调栈就是一个单调递增/递减的栈,每个元素仅入栈一次,例如维护一个递增的单调栈的话,若入栈元素小于栈顶元素就要将栈中小于入栈元素的元素全部pop出去,再push这个元素,这样就在O(n)的复杂度内维护了一个单调栈 单调栈能做什么 1.最基础的应用就是给定一组数,针对每个数,寻找它和它右边第一个比它大的数之间有多少个数。 2.给定一序列,寻找某一子序列,使得子...原创 2018-11-29 16:17:45 · 189 阅读 · 0 评论 -
E - Largest Rectangle in a Histogram -单调栈
E - Largest Rectangle in a Histogram POJ - 2559 题意:n个宽度为1,高度为h[i](1<=i<=n)组成的柱形图,求里面包含的长方形的最大面积; 思路:建立一个单调递增栈维护即可,当新的长方形高于栈内的直接入栈宽度为1,当新的长方形低于或等于栈内高度时栈内元素需要出栈,出栈时更新最大值并且累加宽度以为他是最高的所以他的宽...原创 2018-10-21 16:18:39 · 167 阅读 · 0 评论 -
A - Balanced Lineup-RMQ模板
A - Balanced Lineup POJ - 3264 题意:查询区间最大最小值之差 思路:rmq查询即可,说一下对rmq的理解dp数组 i,j 表示的是从给定序列的第i个位置起向后到i+(1<<j)之间的最值 状态转移方程为dp[i][j]=max或min(dp[i][j-1],dp[i+(1<<(j-1))][j-1])意思是把第i个位置起向后...原创 2018-10-12 17:12:20 · 339 阅读 · 0 评论 -
B - Assignment HDU - 5289-RMQ
B - Assignment HDU - 5289 题意:给出一个数列,问其中存在多少连续子序列,子序列的最大值-最小值<m。 思路:枚举终点,尺取起点O(1)rmq倍增查询 #include<iostream>#include<cstring>#include<cmath>#include<stdio.h>u...原创 2018-10-12 17:56:21 · 184 阅读 · 3 评论 -
A - Subsequence HDU - 单调队列
A - Subsequence HDU - 3530 题意:给你n,m,k以及一数组,n个元素,求一个序列使得序列里最大值减去最小值>=m且<k,求这个序列的最大长度,序列必须连续。 思路:两个单调队列分别维护一个递增序列一个递减序列单调队列里面存储下标即可,每次判断的是到当前i点之前能符合要求的最长子序列,所以让最大最小值相减判断然后让下表小的出队即可一旦跳出不符合...原创 2018-10-19 17:12:37 · 211 阅读 · 0 评论 -
B - Second My Problem First HDU -单调队列
B - Second My Problem First HDU - 3706 单调队列维护固定长度的区间的最小值即可。 #include<bits/stdc++.h>using namespace std;#define maxn 11111111#define ll long longint L, n,a,b;ll ans,num;deque<...原创 2018-10-19 17:56:47 · 177 阅读 · 0 评论 -
D - Fence POJ - 单调队列优化-DP
D - Fence POJ - 1821 题意:现在有n个地板需要画,同时有k个工人分别坐在S[i]位置上。每个工人只能画他周围最多L[i]个位置,如果画必须画上S[i]位置,每画一个可得到P[i]的金钱。求总的最大金钱。 思路:dp[i][j] 表示前i个工人画到第j个地板所得到的最大金钱。 那么dp[i][j] = max(dp[i][j-1],dp[i-1][j]) ...原创 2018-10-19 20:36:31 · 167 阅读 · 0 评论 -
F - Queue CodeForces - 单调队列-二分查找
F - Queue CodeForces - 91B 维护一个单调递减的队列, 最优被定义为位置要尽可能大。 于是对于一个新入队的数来说,如果他比最小的数大的话。其位置也大于最小的数。则这个数是无用的不需入队,但是可以 在单调队列中二分查找一下最后一个比他的小的数的位置,否则如果最小的数比他大他就找不到了但是要入队。 #include<bits/stdc++.h&...原创 2018-10-19 21:55:08 · 916 阅读 · 0 评论 -
J - Sliding Window POJ - 二分优化-单调队列
J - Sliding Window POJ - 2823 1、将队尾所有大于a[i]的值弹出队列 2、插入a[i]到队尾 3、判断队首元素位置是否超出i-k 交c++编译器恰好不超时 可以在进行插入a[i]到队尾时进行二分优化但是我这里队列只记录了下标,没有改动,可以建两个数组一个存值用来二分查询一个存下标用来检查是否在窗口内,这两个数组同步操作,(同入同出) #...原创 2018-10-22 18:54:07 · 184 阅读 · 1 评论 -
G - Watching Fireworks is Fun -单调队列优化DP
G - Watching Fireworks is Fun CodeForces - 372C 题意:一个城镇有n个区域,从左到右1-n,每个区域之间距离1个单位距离。节日中有m个烟火要放,给定放的地点a[ i ]、时间t[ i ] ,如果你当时在区域x,那么你可以获得b[ i ] - | a[ i ] - x |的happiness 。你每个单位时间可以移动不超过d个单位距...原创 2018-10-20 16:10:44 · 235 阅读 · 0 评论 -
H - Points on Line CodeForces - 单调队列|二分
H - Points on Line CodeForces - 251A 题意:问从严格单调递增集合中取出3个数,最大数与最小数的差值小于k的方式有多少种。 思路:固定第一个值去找一个最长能到的点,方式有二分查找upper_bound,或单调队列 #include<stdio.h>#include<algorithm>using namespa...原创 2018-10-20 16:40:24 · 269 阅读 · 0 评论 -
E - Walking Race POJ - 树形DP+单调队列
E - Walking Race POJ - 3162 题意:n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要在这n个距离里取连续的若干天,使得这些天里最大距离和最小距离的差小于M,问怎么取使得天数最多? 思路分步解决,第一个问题典型的树上最远距离两遍DFS,dp更新即可。 第二个问题固定的最值差,两个队列分别维护单调升与单调减序列...原创 2018-10-28 10:17:40 · 179 阅读 · 0 评论 -
P1725 琪露诺-dp-单调队列
P1725 琪露诺 单调队列维护 固定距离区间内的最大值,逆向进行DP转移即可。最后DP[0]即为答案。 #include<bits/stdc++.h>using namespace std;#define maxn 434567int n,s,t,a[maxn];deque<int>q;int main(){ scanf("%d%d%d",&...原创 2018-12-18 17:13:40 · 242 阅读 · 0 评论