学习
moros_nurd
菜鸡
展开
-
单调栈
单调栈前置技能点: 栈 单调队列 闲话:其实并不知道单调队列和单调栈的先后顺序,但既然我是先写单调队列的,那就把单调队列作为单调栈的前置技能点吧。问题:给定序列长度nn,求每个点作为最大/最小值的最长区间。思路:对于每个点,可以直接向左向右枚举直到遇到比它小的数,复杂度为O(n2)O(n^2)对于每个点,可以二分以它作为左端点的区间的长度,然后用线段树得到它是不是该长度的区间的最小值,同理向右处理。原创 2016-08-15 15:58:56 · 390 阅读 · 0 评论 -
斜率优化
斜率优化前置技能点: DP初步 单调队列 求凸包 闲话:前面写这么多都是为了写这个做准备的……本来还应该写一下凸包,但凸包算法比较多,迟点吧……问题:给定非负整数序列aa长度为nn,状态转移方程为DP[i]=minik=1(DP[k]+(sum[i]−sum[k])2+C)DP[i]=\min_{k=1}^{i}(DP[k]+(sum[i]-sum[k])^2+C),求DP[n]思路:最朴素的做法,原创 2016-08-17 21:33:15 · 331 阅读 · 0 评论 -
单调队列
单调队列单调队列 前置技能点 问题 思路 概念引入 复杂度 拓展 例题前置技能点:队列问题:对于一个长度为n的序列,我们希望知道所有以k为长度的子序列的区间最小/大值。思路:struct Node{ int id; int value; }input[NodeNum];可以以O(k)O(k)的复杂度暴力枚举得到[l,l+k)[l,l+k)的最值,由于inputinput中长度为kk的原创 2016-08-14 20:36:09 · 335 阅读 · 0 评论