动态规划

\(dp\)早就已经是经常用到的算法了,于是老师上课主要都在讲题。今天讲的主要是三类\(dp\):树形\(dp\),计数\(dp\),\(dp\)套\(dp\)。其中计数\(dp\)是我很不熟的,\(dp\)套\(dp\)是我没接触过,树形\(dp\)难的题我也不是很会做,所以感觉还是收获了不少,于是\(dp\)的总结将主要会以题解的形式呈现。

重要例题及简要题解

\(Gcd\ counting\):设\(f_{u,v}\)代表以\(u\)为根的子树中,点权都能被\(v\)整除的最长链长度。对于每一个节点,只枚举它的因数,于是可以进行转移。

\(You\ are\ given\ a\ tree\):对于一个给定的\(k\),可以树形\(dp\) \(O(n)\)地计算答案,每次优先选子树内成立的方案,然后再考虑向上延伸即可。不难发现\(f\)数组不同的取值个数只有\(\sqrt n\)种,并且具有单调性,可以二分找段边界。

\(Vladislav\ and\ a\ Great\ Legend\):考虑拆一下式子\(x^k=\sum_{i=0}^kC_{x}^i*i!*S(k,i)\),其中\(S(k,i)\)是第二类斯特林数,表示将\(k\)个元素拆分成\(i\)个集合的方案数。然后化简一下就发现要求\(\sum_{X}C_{f(X)}^i\),涵义为所有非空点集对应的生成树标记了\(i\)条边的方案数之和。然后可以\(dp\),\(f_{u,v}\)代表以\(u\)为根的子树中标记了\(v\)条边的方案,背包即可。

\(Uniformly\ Branched\ Trees\):考虑做树同构是要找重心的,那么\(dp\)计数肯定也要找重心作为根。设\(dp_{i,j,k}\)表示节点数为\(i\),共有\(j\)棵子树,每棵子树的大小都不超过\(k\)的有根树数量,然后\(dp\)。考虑单重心和双重心分别统计答案即可。

\(Multiplicity\):设\(p_{i,j}\)表示使用了\(a\)序列的前\(i\)个元素,造了长度恰好为\(j\)的子序列的方案数,第二维只需枚举因子转移,滚动数组即可。

\(Maximum Element\):考虑计算的函数返回正确的方案数,设\(f_i\)代表\(1-i\)的排列中有多少个是正确返回的,化简式子发现可以\(O(n)\),\(dp\)计算即可。

\(Hero\ Meet\ Devil\):很经典的一个\(dp\)套\(dp\),我们要把\(LCS\)的\(dp\)数组\(f\)压起来当作状态,于是想到差分。设\(f_{i,S}\)代表\(T\)串考虑到了第\(i\)位,\(LCS\) \(dp\)数组差分后压缩为状态\(S\)的方案数,内层\(dp\)可以预处理,外层\(dp\)直接转移即可。

\(XHXJ’s\ LIS\):考虑二分求\(LIS\)的\(dp\)做法,就可以\(dp\)套\(dp\),由于二分做法中栈内元素是单调的,所以直接把每个数字是否出现再栈里压成一个状态,然后在外部做数位\(dp\),状态为\(f_{i,op,S}\)代表考虑了\(i\)位,与目标值大小关系为\(op\),\(LIS\)栈状态为\(S\)的方案数,可以直接转移。

数据结构

这次老师的数据结构也没有具体地讲算法,都是讲例题的。考虑到有些题还有有点套路,没有详解的必要,于是这里就写了个别有价值例题的题解。同时,我在这里理一个表,简单地写了我对各类数据结构和数据结构类算法的理解。

重要例题及简要题解

\(1.\) 树链权值交:考虑序列上的版本,我们将第二个序列的值改为原数值在第一个序列上出现的位置,那么问题就转化为了在二个序列的区间内求在某个连续范围内的数字个数,可以用主席树解决。树上也是同理,只需对第一颗树链剖,对第二颗树建主席树即可。

\(2.\) 整除路径统计:考虑点分治,可以对每棵子树内的路径先计算最大值和权值和,然后考虑合并。把二元组按最大值大小排序,于是枚举一个点就确定了最大值,权值和直接在模\(p\)意义下处理,就能直接推出剩下一半最权值和需要是多少,用桶统计即可。

数据结构及数据结构类算法的理解

并查集

维护无向图连通性的有利工具,可以扩展为带撤销操作,多个意义的域或者是带边权等,有向关系可以转换为\(2-sat\)模型。

树状数组

用于维护前缀和,支持修改和快速查询。可以扩展支持区间修改区间查询,也可以扩展到二维前缀和。在值域树状数组上倍增,可以实现查询第\(k\)大。

线段树

序列维护区间信息的工具,前提要求是信息具有区间可加性,能够区间合并。当线段树作用在值域上时,还可以二分查找第\(k\)大。树上统计问题可能会用到线段树的合并算法,特别是用来计数的值域线段树。还可以维护扫描线算法,或者用来优化建图。

分块

一种暴力算法,可以维护各种各样的信息。当需要维护的信息难以处理时,就可以考虑分块算法,主要问题在于思考如何处理整段信息和如何处理边界信息。可以扩展到树上,实现块状树。

点分治

用于树上路径统计,常用的有两种方法:子树用数据结构维护的统计方法和先跑下所有子节点信息再统一计算贡献的统计方法,可能需要结合其他数据结构或计数算法。

cdq分治

主要作用有三种:\(1.\) 解决偏序问题 \(2.\) 加速或维护动态规划 \(3.\) 处理动态的数据结构问题,化动态为静态。 对于\(1\),核心思想在于部分有序的排序过程,对于\(2\),核心思想在于计算左半边对右半边的转移,对于\(3\),核心思想在于计算修改操作对查询操作产生的贡献。适用范围较广。

整体分治

对所有询问同时进行二分答案,于是就可以对询问和修改操作进行分类处理,以得到格式相同的子问题,进行分治。对于限制较多,维数较高的数据结构问题可以考虑。

线段树分治

也是时间分治算法的一种,和\(cdq\)分治很像,不过使用线段树来记录时间线上的信息,处理询问时只需\(dfs\)即可,回退时需要支持撤销操作。

Treap

维护值信息的有效工具,功能较多,一般来说可以用值域树状数组和值域线段树代替。

Splay

可以提取子树,操作区间的平衡树。使用范围较广,对于较复杂区间问题可以考虑。

LinkCutTree

解决动态树问题时考虑使用,可以维护链信息,需要\(splay\)辅助。

trie/可持久化trie

处理字符串问题以外可以处理异或最大值,可持久化就能处理区间异或最大值。

主席树

前缀和版的线段树,可以利用前缀和的区间可减性实现对一个区间内的所有线段树进行操作,当然可以当可持节化线段树用。

莫队

用来处理区间问题,要求区间支持转移。当转移受限时,可以拓展到回滚莫队,当有修改操作时,可以拓展到带修莫队。当然使用\(dfs\)序搬到树上是可以的。

树链剖分

将树上路径问题和子树问题转化为不超过序列问题,再利用其他数据结构实现对序列的维护。


『正睿OI 2019SC Day6』的更多相关文章

  1. 『正睿OI 2019SC Day8-Day17』

    于是就迎来\(10\)天的自闭考试了,每天写点小总结吧. Day8 第一天就很自闭啊,考题分别是数学题+建模题+图论. 前两道题都没有什么算法,但是难度还是有的,于是就做不太出来,特别是第一题.第二题 ...

  2. 『正睿OI 2019SC Day7』

    简单数论 质因子分解 素性测试 素性测试指的是对一个正整数是否为质数的判定,一般来说,素性测试有两种算法: \(1.\) 试除法,直接尝试枚举因子,时间复杂度\(O(\sqrt n)\). \(2.\ ...

  3. 『正睿OI 2019SC Day5』

    网络流 网络流的定义 一个流网络\(G=(V,E)\)为一张满足以下条件的有向图: 每一条边有一个非负容量,即对于任意\(E\)中的\((u,v)\) , 有\(c(u,v)\geq0\). 如果\( ...

  4. 『正睿OI 2019SC Day4』

    总结 今天是一场欢乐的\(ACM\)比赛,于是我队得到了全场倒数的好排名. 好吧,其实还是怪自己不能怪队友啦.对于\(ACM\),可能最主要的还是经验不足,导致比赛的时候有点紧张.虽然队友为了磕一道题 ...

  5. 『正睿OI 2019SC Day1』

    概率与期望 总结 老师上午几乎是在讲数学课,没有讲什么和\(OI\)有关的题目,所以我就做了一点笔记. 到了下午,老师讲完了有关知识点和经典模型,就开始讲例题了.前两道例题是以前就做过的,所以没有什么 ...

  6. 『正睿OI 2019SC Day3』

    容斥原理 容斥原理指的是一种排重,补漏的计算思想,形式化的来说,我们有如下公式: \[\left | \bigcup_{i=1}^nS_i \right |=\sum_{i}|S_i|-\sum_{i ...

  7. 『正睿OI 2019SC Day2』

    分治 普通分治 普通分治是指针对序列或平面问题的分治算法. 思想 普通分治的思想是指将一个序列问题或平面问题通过某种划分方式划分为若干个子问题,直到子问题规模足够小,可以直接回答,再通过合并得到原问题 ...

  8. 正睿OI DAY3 杂题选讲

    正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...

  9. 正睿OI国庆DAY2:图论专题

    正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力 ...

随机推荐

  1. JavaScript深入浅出第3课:什么是垃圾回收算法?

    摘要: JS是如何回收内存的? <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一 ...

  2. ETL中获取公共时间参数变量释义

  3. tomcat server.xml 中 host 元素

    测试偶然发现: <Host name="127.0.0.1" appBase="webapps" unpackWARs="true" ...

  4. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  5. Nginx 高级配置-自定义json格式日志

    Nginx 高级配置-自定义json格式日志 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在大数据运维工作中,我们经常会使用flume,filebeat相关日志收集工具取收集日志 ...

  6. 06、自动挂载+超级守护进程+时间同步+tcpwrapper+软硬链接+日志管理

    autofs  自动挂载服务   把下面这两条命令做成自动挂载 172.16.2.35:/share/soft /nfs/soft 172.16.2.35:/share/iso  /nfs/iso . ...

  7. 查看linux服务器配置信息命令

    查看 cpu信息: cat /proc/cpuinfo 查看内存信息: grep MemTotal /proc/meminfo 查看操作系统信息: uname -a 查看centos版本信息: cat ...

  8. Andriod Studio安装及使用

    创建Andriod项目 1.下载最新版的Andriod studio 2.在 Welcome to Android Studio 窗口中,点击 Start a new Android Studio p ...

  9. 【oracle】ORA-00257 archiver error. Connect internal only, until freed

    [原因]归档日志太多导致磁盘空间过小. [解决办法]删除日志或加大空间

  10. java 多态调用

    1. 调用成员变量:编译.运行都看左边.2. 调用成员方法:编译看左边,运行看右边.  ----------  instanceof 判断某个对象是否属于某种数据类型: boolean  b  = 对 ...