2024.11.18至2024.11.22周总结

本周学习任务#

清单#

DP#

本周黄队详讲了DP有关知识的拓展,从本质到转移方式再到优化等。

  • 本质

    一般DP可以理解为DAG上推式子。特殊的可能需要解方程(直接解&高斯消元),以及图论(最短路,同余最短路)来解决。

  • 四大要素

  1. 状态,最好是无后效性,把不能直接处理的&后面要用到的,都塞到状态里。
  2. 转移方程,就近转移。
  3. 初值,按照定义赋值。
  4. 最终答案,考虑是一个状态还是若干个得到。
  • 转移方式

  1. 往后推,因为是顺着思路所以一般较为好理解。
  2. 从前推,逆向思维,更常用,且在决策单调性方面更好处理。
  • 转移顺序

  1. 拓扑序,因为DP本质上类似于DAG,故可以。有时候不止一种拓扑序考虑换循环的顺序。
  2. 记搜,复杂度要仔细分析一下,典型就是数位DP。
  • 优化方式

  1. 空间:状压、滚动数组

  2. 时间:

    单调队列优化(比单调栈强),通常形式为:

    fi=minlijrifj

    • 也可能是与 i,j 有关的一些数值,只要是走过了 j,就可以看成是定值即可。
    • liri 单调。
    • 在线。

    斜率优化

    去除多余的点,快速寻找决策点。例如单调队列无法处理 cicj 的问题,就可以用斜率优化。

    通常形式:

    fi=min1ji1ai+bj+ciscj

    1. 李超线段树(维护直线)

      速度稍慢,但是处理范围广。

      转化一下上面的式子。

      fiai=cicj+bj

      y=kx+b

      就是一条自变量为 i 的直线。

      查询单 log,修改两只 log

    2. 队列(维护凸壳)

      速度更快,但是限制多。

      把上面的式子换一下:

      bj=cicj+fiai

      y=kx+b

      相当于拿一根已知斜率的直线去过每个点,看截距的最小值。那么只需要从下往上移动这个直线,看第一个过的点是哪个。

      这个不会。

    ex:小寄巧:拆式子变成以上的形式,换维度枚举顺序等。

  • 特殊奇妙DP

  1. 子集和DP

    作用:求高维前缀和和高维偏序。

    咕咕咕

  2. 超集和DP

    上面那个反过来。还是不会

    咕咕咕

  3. 自动机DP

    • 类似自动机的思想来做,适用于简单的DP。
    • 真正建出自动机,在自动机上DP,如AC自动机、后缀自动机。

咕咕咕

DS#

本周刘队讲了线段树的拓展。

  • 基本知识

    定义上线段树就是一种可以维护区间信息的数据结构,在原数列的基础上多加了一些点,一层一层往上合并的过程。

    特殊的就是打 lazy tag 方式和其他的一些线段树处理方式。

    多种标记的时候需要分析优先级,比如加法和乘法的优先级。

  • 典型线段树

  1. 区间加法乘法:考虑分配律,乘法的时候应该先下传乘法标记,加法标记需要乘上本来的乘法标记。
  2. 区间最大子段和:每个区间维护区间和 sum,以左端点开始的最大子段和 lsum,以右端点开始的最大子段和 rsum,整个区间的最大子段和 msum,合并时有:

    sumrt=sumlson+sumrson

    lsumrt=max{lsumlson,sumlson+lsumrson}

    rsumrt=max{rsumrson,sumrson+rsumlson}

    msumrt=max{msumlson,msumrson,rsumlson+lsumrson}

  3. 按位线段树:有些题需要处理二进制的问题,就可以把数字拆位,建若干个线段树进行处理。(这个还不会,咕咕咕)
  • 线段树拓展

  1. 主席树

    就是把每次更改的版本存下来,但是如果每一次都存肯定不行,所以只将修改的点插入到原本的线段树上,如图:

    经典的例题就是静态区间第 k 小。需要建一棵值域主席树。对于寻找当前区间 [l,r] 中值域里的第 k 大,我就正常线段树二分,但是同时二分两棵线段树,对于一个 mid,前一半的值域在 [l,r] 中数的个数等价于 [1,r] 中数的个数减去 [1,l1] 中数的个数

    拓展一下就是动态区间第 k 小,需要树套树我们可以给主席树套一棵树状数组,每次暴力修改完在树状数组上维护,注意树状数组记录的其实只是每一棵主席树的树根,所以跑树状数组每一个点时要在对应的主席树上进行修改。查询可类比上文,上文中我们记录了两个树根,现在我们可以把树状数组上的一些相关的树根开两个数组记一下,每次二分就把所有树的答案累加起来。

  2. 线段树合并

    注意合并要用动态开点线段树,不然复杂度会变成 O(nlog2n) 的,因为线段树有 O(nlogn) 个节点,合并又是 O(logn) 的。

    我们还是在树上走,如果走到一点地方时存在节点(可能是一个或两个)为空,就可以直接返回另一个节点,否则就往下递归,到叶子时合并回来即可。

    分析一下复杂度。

    容易发现:在合并两棵树的过程中走到有空节点的时候就返回了,相当于走一个点就会删掉一些点,所以总复杂度不会超过总点数也就是 O(nlogn)

    为什么需要合并线段树,因为对于一些问题我们需要合并的信息是 O(n) 级别的,对于这类式子我们肯定需要一种 O(log) 的方式去优化。

    如何去理解合并的过程,如果真的每一个点都开一个线段树那肯定爆炸。其实我们是把每个点对应在一段区间上,或是下标或是值域,然后对于每一个点的线段树动态开点,最后是合并过程中并不是单纯的加加减减,而是要根据你的式子去还原。

  3. 李超线段树

    用于处理线段(直线)最大值的问题,通常用于 DP 优化等,它可以快速查询位置上纵坐标最大/小的线段编号以及数值。考虑这种东西就很适合去解决一些需要从区间中找最值转移状态的题。

    板子的话其实没什么用,一般都不会这么考。

  4. 扫描线

    侠义上指的是矩形面积并,广义上是处理二维数点或者统计答案的数据结构。

    咕咕咕

  5. 树套树

    字面意思,就是树的每个节点又代表一棵树。这个考的很多,真的很烦。

  6. 线段树优化建图

    例题就是 Legacy,不过太久远了,大致意思就是将建出来的线段树的节点进行连边,这样跑最短路(忘了是不是了)。

    题型较少,咕咕咕

作者:God_Max_Me

出处:https://www.cnblogs.com/lizihan00787/p/18562456

版权:本作品采用「God_Max_Me-非商业性使用」许可协议进行许可。

posted @   God_Max_Me  阅读(5)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示