『正睿OI 2019SC Day6』
动态规划
\(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』的更多相关文章
- 『正睿OI 2019SC Day8-Day17』
于是就迎来\(10\)天的自闭考试了,每天写点小总结吧. Day8 第一天就很自闭啊,考题分别是数学题+建模题+图论. 前两道题都没有什么算法,但是难度还是有的,于是就做不太出来,特别是第一题.第二题 ...
- 『正睿OI 2019SC Day7』
简单数论 质因子分解 素性测试 素性测试指的是对一个正整数是否为质数的判定,一般来说,素性测试有两种算法: \(1.\) 试除法,直接尝试枚举因子,时间复杂度\(O(\sqrt n)\). \(2.\ ...
- 『正睿OI 2019SC Day5』
网络流 网络流的定义 一个流网络\(G=(V,E)\)为一张满足以下条件的有向图: 每一条边有一个非负容量,即对于任意\(E\)中的\((u,v)\) , 有\(c(u,v)\geq0\). 如果\( ...
- 『正睿OI 2019SC Day4』
总结 今天是一场欢乐的\(ACM\)比赛,于是我队得到了全场倒数的好排名. 好吧,其实还是怪自己不能怪队友啦.对于\(ACM\),可能最主要的还是经验不足,导致比赛的时候有点紧张.虽然队友为了磕一道题 ...
- 『正睿OI 2019SC Day1』
概率与期望 总结 老师上午几乎是在讲数学课,没有讲什么和\(OI\)有关的题目,所以我就做了一点笔记. 到了下午,老师讲完了有关知识点和经典模型,就开始讲例题了.前两道例题是以前就做过的,所以没有什么 ...
- 『正睿OI 2019SC Day3』
容斥原理 容斥原理指的是一种排重,补漏的计算思想,形式化的来说,我们有如下公式: \[\left | \bigcup_{i=1}^nS_i \right |=\sum_{i}|S_i|-\sum_{i ...
- 『正睿OI 2019SC Day2』
分治 普通分治 普通分治是指针对序列或平面问题的分治算法. 思想 普通分治的思想是指将一个序列问题或平面问题通过某种划分方式划分为若干个子问题,直到子问题规模足够小,可以直接回答,再通过合并得到原问题 ...
- 正睿OI DAY3 杂题选讲
正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...
- 正睿OI国庆DAY2:图论专题
正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力 ...
随机推荐
- android studio学习----Failed to resolve: com.android.support:design:22.1.1
这个目前好像没有合适的办法,唯一可行的就是 点击那个提示 进行SDK Manager下载就可以了 但是天朝的网啊,我试了很多次,突然的可以下载,运气啊 类似这一系列问题解决办法就是 重新更新SDK ...
- SAP CRM Product Interlinkage - Customer Product ID的一个例子
For detail technical introduction about relationship, please refer to this wiki. The relationship tr ...
- 下载win10系统
有时候想重装系统但总找不到下载的地方,今天记录一下.nsdn我告诉你,这里有许多软件下载 网站URL:https://msdn.itellyou.cn/ 我想下载一个Windows10 磁力地址 ed ...
- Fundebug录屏插件更新至0.4.0,修复BUG,优化性能
摘要: 录屏功能更加强大,欢迎免费试用! 关于Fundebug录屏功能 Fundebug是专业的程序BUG监控服务,当线上应用出现BUG的时候,我们可以第一时间报警,帮助开发者及时发现BUG,提高De ...
- rac启动维护笔记
Ohasd.bin将产生4个代理启动相关的资源 (1) oraagent:负责ora.asm.ora.evmd.ora.gipcd.ora.gpnpd.ora.mdnsd的启动和管理 (2) ...
- SQL Server 修改表结构(转载)
SQL Server 修改表结构 本文链接:https://blog.csdn.net/petezh/article/details/81744374 查看指定表结构 exec sp_help Rep ...
- 找出所有文件最小可resize尺寸
--找出所有文件最小可resize尺寸 SELECT a.file_id, CEIL( ( NVL( hwm,1 ) * blksize ) / 1024 / 1024 ) smallest_M, C ...
- 年薪30W测试工程师成长之路,你在哪个阶段?
对任何职业而言,薪资始终都会是众多追求的重要部分.前几年的软件测试行业还是一个风口,随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业,目前软件测试行业“缺口”已经基本饱和.当然,我说的是最基础 ...
- 【转】Pandas学习笔记(二)选择数据
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
- MySQL小测试
<> 2.创建一个字符集为utf8的数据库,将数据库字符集修改为gbk create database db1 charset='utf8'; alter database db1 cha ...