随笔分类 - 数据结构--单调栈
摘要:前言 发现自己居然没有写过笛卡尔树的构建的总结。。 正文 笛卡尔树的概念 待补。 笛卡尔树的构建 我们通过不断维护“最右链”来构造笛卡尔树,也就是每次笛卡尔树的最右链(当前栈)一定是单调递减/增的,然后如果有弹栈操作,我们就把这个节点作为我们当前末尾的左儿子,弹完后这个节点作为当前栈底的右儿子,成为
阅读全文
摘要:题目 CF1483C Skyline Photo 分析 首先看到这个题很明显可以序列上dp,设置状态很常规,就是前i个位置可以得到的最大收益。 关键是转移,考虑朴素的转移:\(dp[i]=\max\limits_{j=1}^{i}\{dp[j-1]+b[minpos]\}\) 然后考虑优化,这类需要
阅读全文
摘要:题目 CF1156E Special Segments of Permutation 分析 分治,单调栈,笛卡尔树。 分治经典套路了,像这样数点对的都可以考虑分治。(树上就考虑点分治) 同样是经典套路,每次分治时钦定一定是右侧存在最大值或者左侧存在最大值。 然后双指针和一个数组统计即可,具体见代码。
阅读全文
摘要:前言 提供一种不需要并查集的严格线性做法。 其实也差不了多少。 题目 题目链接 分析 题目描述稍微有点复杂,其实我们可以直接看成是这样的问题: 给定 \(m\) 个多米诺骨牌,每个有高度和价值,要求推倒所有的骨牌,求最小代价。(推动的规则见题面最后一段) 显然可以考虑 dp 来做,设 \(dp[i]
阅读全文
摘要:题目 给定n,k和一个长度为n的序列,求最长的最大值最小值相差不超过k的序列 分析 可以直接双指针+RMQ来维护,复杂度是 \(O(nlogn)\) 的(约束RMQ爬)。 这里讲一个单调队列的思路。 维护两个单调队列,一个单调上升,一个单调下降。 然后每加入一个元素先更新两个队列,然后看一下两个队首
阅读全文
摘要:题目 CF5E Bindian Signalizing 分析 单调栈$+dp$ 。 首先我们要把环处理成链,这道题因为特性我们可以直接把最高的山选成第一个就好了。 然后可以使用单调栈,维护一个单调递减的单调栈,更新答案就是相当于当前这个点之前所有比这个点小的都由这个点更新,完了放进栈里面,注意判断相
阅读全文