一般难度模板复习
Stoer-Wagner算法
求无向图全局最小割的一种算法。设一张图的点集为,边集为。我们说集合是图的割,当且仅当且存在的一个划分和,使得,一个割的权值就是割中边权的和。
考虑一个事实:对于任意两点,在一个割中或在同一划分内,或在不同划分内。那么可以先考虑计算割,再将两点合并(之间的边消去,连向其它点的边合并)并递归计算即可。
而Stoer-Wagner算法将告诉我们,总存在一对点使得最小割就是将的所有边割除的情况。
考虑这样找到满足要求的:设一个点集,初始情况下为空。对于不在中的点,定义其权值为。如果每次选择最大的加入(相同则随意),那么最后两个加入的点就是和(为最后一个点)。
证明:只要证对于任意一种割,都有即可。令,,。将所有点按照加入的顺序排成一个列,对于任意一种割,设其对应的分划为,我们称满足,即与前一个点不在一个分划内的点为活跃点,显然为活跃点。对于任意一个活跃点,我们证明即可。
采用归纳法,对于第一个活跃点,不难发现,对于之后任意活跃点,设其前一个活跃点为,将中的边分为三部分:,之间的点与的连边(设这个集合为),其他边。那么有:
于是结论成立。
扩展中国剩余定理
显然只需要考虑合并两个同余方程的情况:
第一个方程的通解为,代入第二个方程即有,改写为,利用扩展欧几里得求解即可。
回文自动机
对于一个字符串,的回文自动机的每个节点代表的一个回文子串(内容相同的字串在同一个节点上),另有两个特殊节点奇根和偶根。后文将不严格区分节点和其对应的回文串
回文自动机的节点有如下基本属性:
表示的长度,特别的,奇根的为,偶根的为。
表示的最长回文严格后缀,特别的,如果没有回文严格后缀,则其为偶根;偶根的为奇根,奇根的为自己。
表示在前后各加上字符之后形成的新回文串。特别的,如果新回文串不是的子串,则为偶根;奇根的节点代表单个字符组成的回文串,偶根的节点代表两个字符组成的回文串。
先证明回文自动机的一个性质:的回文自动机节点数为。
证明:对于任意的,对其前缀采用数学归纳法。(空串)的回文自动机只有奇根和偶根,显然成立。
假设命题对成立,显然对于的回文自动机,其可能新增的节点都对应的回文后缀。假设其有非空的最长回文后缀,那么可能是回文自动机新增的节点,且其他的回文后缀也是的回文后缀。
考虑的回文后缀也是的回文前缀,因此其必定出现在中,也就已经在原回文自动机上。因此回文自动机最多新增一个节点,命题对也成立。
下面考虑如何构造回文自动机。对于字符串,先构造出的回文自动机,再在此基础上继续构造。
我们记录的最长回文后缀(没有则为偶根),由之前命题的证明,我们只需考虑是否需要添加的最长回文后缀。令的最长回文后缀为(没有则为空串),显然一定是的回文后缀,其对应节点就是的祖先(如果为空串,定义为奇根)。
那么考虑先找到,只要在树上从开始不断查找,就能按长度从大到小的顺序遍历的所有回文后缀,找到第一个满足的节点,就是满足要求的。由于树的根为奇根,为,因此这样的点总是可以找到的。
那么显然有为,如果已经存在,那么无需添加新的节点,记为即可。
否则,令的对应节点为,并将记为。显然有,且皆为偶根。
再考虑找到的问题。设的最长回文严格后缀为,可知是的祖先,记为。从开始向上找到第一个满足的节点即为所需要的,于是就是。最后将设为。
最后证明构造回文自动机的复杂度。先归纳假设所有节点在树上的深度都不超过其父亲的深度。考虑增量时在树上找和的过程,每次当前点的深度。而最后为的孩子,因此的深度不超过的深度,的深度也就不超过的深度。显然深度不超过其父亲的深度,归纳假设成立。由于深度的增量是的,向上查找和的总复杂度也是的。如果字符集为常数,构造回文自动机的复杂度就为。
图论经典问题
最大独立集最小顶点覆盖
因为一个点集是独立集等价于其补集是点覆盖。
二分图最小点覆盖等于最大匹配
分为两部分证明:先证任意匹配点覆盖。考虑一个匹配,对于任何一条匹配边,两端的点至少有一个在点覆盖中,且匹配边点不重复,故命题成立。
下面用最大匹配构造一个点覆盖。考虑对右半部分的每个未匹配点尝试增广,由于是最大匹配必定增广失败。将增广完毕后,左半部分访问过的匹配点和右半部分未访问的匹配点作为一个点集,先证明这个点集大小为最大匹配:由增广的特性,对于一条匹配边,在左半部分的点被访问后立即会访问右半部分的点,否则均不访问,因此命题成立。再证这是一个点覆盖:对匹配边来说是显然的,对于非匹配边,若其右半部分点被访问,则其一定被尝试增广过,故左半部分的点一定是匹配点(否则就增广成功了),于是左半部分是点集中的点;若其右半部分的点未被访问,由于每个没匹配的右半部分点都被增广过,因此这个点是匹配点,也在点集中,证毕。
证法2:二分图建成网络流,边的流量为无穷,最小割就是最小点覆盖。我又白证了一堆东西QAQ
一种代替(吊打?)单调队列的方法
一般难度模板复习×
一般难度模板预习√
在学弟x义x的博客中看到的,我自作主张简称它为扩展单调队列。
可以解决这样的问题:维护一个队列,并支持查询队列中的所有元素对一个运算的和,满足结合律,单次快速计算,但不一定有逆运算。支持强制在线(狂喜)
可以发现如果是数字的取,那就是单调队列板子题,但一般的运算不一定满足这样好的性质。
扩展单调队列方法如下:取一个队列中的关键位置,维护所有的后缀和的前缀和,加入元素只要更新前缀和即可,也支持快速查询。
但是关键位置可能被弹出队列,此时我们重新将关键点设置为右端点,并重新计算所有的后缀和。注意到此时被计算后缀和的位置在下一次重设关键点时一定都被弹出了,所以只会对这一次重构产生贡献,总复杂度就是线性的。
拉格朗日反演
设是的复合逆,则拉格朗日反演式如下:
证明:
为方便没有抽象代数基础的OIer们理解,增加一些合理的定义:
形如的多项式在通常意义下不可逆,但如果将的指数范围从非负整数扩展到整数,我们可以认为:
同样可以定义扩展后的多项式的导数,有一个性质是。
根据上面的定义,我们只要证明一个更简洁的式子:
考虑设,,对等式两边求导得:
于是有:
又:
于是就证明了拉格朗日反演。